我是加密新手。我需要在表中保存一个字段(DocNumber)。我通过设置:
将其保存为加密的varbinary字段 docNumber = ENCRYPTBYPASSPHRASE('password', @docnumber)
当我想使用docnumber查询表时,我会执行以下操作:
WHERE docNumber = DECRYPTBYPASSPHRASE('password', @docNumber)
然而,它无法返回符合条件的记录。然后我观察到,如果我用相同的密码和值重复调用ENCRYPTBYPASSPHRASE()
,我最终得到不同的加密值。
我在哪里弄错了?你通常如何解决这个问题?
答案 0 :(得分:3)
我总是以这种方式使用它,只是稍微不同的方式来组织谓词:
WHERE CONVERT(VARCHAR(64), DECRYPTBYPASSPHRASE('password', docNumber)) = @docNumber;
区别在于您在原始值上运行解密,其中包括保存时的密码,而在您尝试的版本中,您再次解密,这会生成不同的密码。
编辑使用HASHBYTES()
添加示例:
USE tempdb;
GO
CREATE TABLE dbo.enctest(x VARBINARY(64));
GO
INSERT dbo.enctest(x) SELECT HASHBYTES('SHA1', 'foo');
INSERT dbo.enctest(x) SELECT HASHBYTES('SHA1', 'bar');
GO
SELECT x FROM dbo.enctest WHERE x = HASHBYTES('SHA1', 'foo');
GO
DROP TABLE dbo.enctest;
GO