2014-10-12 158 views
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 2014-10-12 12:56:39

+0

@bummi使用'CONVERT()'后,它仍然返回NULL' – 2014-10-13 17:13:09

回答

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加密的新手。 – 2014-10-13 17:58:57

+0

因为我不确定你需要什么,所以一个简单的可能用途可能是使用加密程序'Alter Procedure P_GetUserforEmail(@email varchar(50)) WITH ENCRYPTION as ....'提供电子邮件的用户名。 – bummi 2014-10-13 20:28:59