2011-09-14 37 views
2

我對加密很陌生。我需要保留一個表格(DocNumber)加密的字段。我把這個作爲加密VARBINARY字段設置:檢索使用encryptbypassphrase保存的行

docNumber = ENCRYPTBYPASSPHRASE('password', @docnumber) 

當我想用docnumber我查詢表如下:

WHERE docNumber = DECRYPTBYPASSPHRASE('password', @docNumber) 

但是它未能恢復符合條件的記錄。然後我觀察到,如果我用相同的密碼和值重複呼叫ENCRYPTBYPASSPHRASE(),我最終會得到不同的加密值。 我在哪裏犯錯?你通常如何解決這個問題?

回答

2

我一直使用這種方式,只是一個稍微不同的方式來組織謂詞:

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 
+0

我知道我可以試試這個,但這種方法的數據庫索引不使用,效率非常低 – josephj1989

+0

那麼也許你應該考慮varbinary列,並使用HASHBYTES ()與適當的算法(SHA1,MD5等)。使用HASHBYTES,您每次都會得到相同的哈希值。 –