0

Я пытаюсь извлечь имя пользователя, имеющим указанную электронную почту из базы данных с помощью SQL-запроса:Сравнения шифрованных столбцов в запросе

SELECT [USERNAME] FROM REGTAB WHERE DECRYPTBYASYMKEY(ASYMKEY_ID('ENKEY'),[EMAIL])[email protected] 

Но он показывает NULL выхода. Нужно ли зашифровать ввод @email перед сравнением? Будет ли он всегда давать одинаковое зашифрованное значение для определенного ввода?

Я использую алгоритм RSA 2048.

+1

[DECRYPTBYASYMKEY() не возвращает ожидаемое значение] (HTTP://stackoverflow.com/questions/8768144/decryptbyasymkey-not-returning-expected-value) – bummi

+0

@bummi после использования 'CONVERT()' он все еще возвращает 'NULL' –

ответ

1

Это выстрел в темноту, так как вы не обеспечили способ создания ключа ENKEY.
Из-за поведения, которое я ожидаю, он был создан с паролем, и вы не предоставляете пароль для DECRYPTBYASYMKEY, который можно вызвать без третьего параметра, например. Ключи, используя главный ключ базы данных.

/* 
CREATE ASYMMETRIC KEY ENKEY 
    WITH ALGORITHM = RSA_2048 
    ENCRYPTION BY PASSWORD = 'Mydummypassword'; 
*/ 

/* 
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'password' 
CREATE ASYMMETRIC KEY ENKEY2 
    WITH ALGORITHM = RSA_2048 

*/ 

Declare @aValue Varchar(50) 
Select @aValue='Test' 

Select DECRYPTBYASYMKEY(ASYMKEY_ID('ENKEY'), 
EncryptByAsymKey(AsymKey_ID('ENKEY'), @aValue) 
) as [WithOutPassword] 
, 
DECRYPTBYASYMKEY(ASYMKEY_ID('ENKEY'), 
EncryptByAsymKey(AsymKey_ID('ENKEY'), @aValue) 
,N'Mydummypassword') as [WithPassword] 

,Case when @aValue=DECRYPTBYASYMKEY(ASYMKEY_ID('ENKEY'), 
EncryptByAsymKey(AsymKey_ID('ENKEY'), @aValue) 
) then 1 else 0 end as [IdenticWithOutPassword] 

,Case when @aValue=DECRYPTBYASYMKEY(ASYMKEY_ID('ENKEY'), 
EncryptByAsymKey(AsymKey_ID('ENKEY'), @aValue) 
,N'Mydummypassword') then 1 else 0 end as [IdenticWithPassword] 

поставит результат:
NULL 0x54657374 0 1

Select DECRYPTBYASYMKEY(ASYMKEY_ID('ENKEY2'), 
EncryptByAsymKey(AsymKey_ID('ENKEY2'), @aValue) 
) as [With MASTER KEY ENCRYPTION] 

,Case when @aValue=DECRYPTBYASYMKEY(ASYMKEY_ID('ENKEY2'), 
EncryptByAsymKey(AsymKey_ID('ENKEY2'), @aValue) 
) then 1 else 0 end as [Identic] 

поставит результат:
0x54657374 1

+0

с pa ssword, а затем с помощью 'CONVERT()' работает нормально. Но я хочу скрыть этот пароль. Я не хочу, чтобы это было видно в запросе. Как мне это сделать? Пожалуйста, помогите мне, поскольку я новичок в SQL Server Encryption. –

+0

Поскольку я не уверен, что вам понадобится, одним из возможных способов использования может быть использование зашифрованной процедуры «Alter Procedure P_GetUserforEmail (@email varchar (50)) С ENCRYPTION as ....' предоставление имени пользователя для электронной почты. – bummi

Смежные вопросы