2011-12-14 60 views
3

我正在修改使用SQL Server的PWDEncrypt和PWDCompare函數將散列密碼存儲到表的varbinary列中的應用程序。SQL Server - PWDEncrypt和PWDCompare的替代實現

由於不應該使用這些函數(由於算法中可能發生的變化或將來會被棄用),我想將應用程序轉換爲使用支持的HASHBYTES函數。

是否有人使用HASHBYTES功能實現與PWDENCRYPT/PWDCOMPARE相同的功能的代碼,這樣我就不必讓每個用戶在切換期間更改密碼,並且現有哈希密碼仍然有效?

我正在使用SQL Server 2008 R2。

回答

4

我已經設法使用SQL生成了我自己的PWDENCRYPT和PWDCOMPARE實現。

不幸的是,由於在PWDENCRYPT節中使用了RAND(),所以無法將其轉換爲UDF。

這是執行PWDEncrypt代碼

DECLARE @passwordToEncrypt NVARCHAR(MAX) 
SET @passwordToEncrypt = 'Password' 

DECLARE @salt VARBINARY(4) 
SET @salt = CONVERT(VARBINARY(4), RAND()) 

DECLARE @encryptedPassword VARBINARY(128) 

SET 
    @encryptedPassword 
    = 
    0x0100 
    + 
    --Salt 
    @salt 
    + 
    --Hash of Password + Salt 
    HASHBYTES('SHA1', @passwordToEncrypt + CONVERT(NVARCHAR(MAX), @salt)) 

SELECT 
    @passwordToEncrypt [OriginalPassword], 
    @encryptedPassword [MyPWDEncrypt], 
    PWDCOMPARE(@passwordToEncrypt, @encryptedPassword) [SQLPWDCompare] 

這是執行PWDCompare

DECLARE @passwordToTest NVARCHAR(MAX) 
SET @passwordToTest = 'Password' 

DECLARE @encryptedPassword VARBINARY(128) 
SET @encryptedPassword = PWDENCRYPT(@passwordToTest) 

SELECT 
    @passwordToTest [OriginalPassword], 
    @encryptedPassword [SQLPWDEncrypt], 
    CASE WHEN 
     @encryptedPassword 
     = 
     --Header 
     0x0100 
     + 
     --Salt 
     CONVERT(VARBINARY(4), SUBSTRING(CONVERT(NVARCHAR(MAX), @encryptedPassword), 2, 2)) 
     + 
     --Hash of Password + Salt 
     HASHBYTES('SHA1', @passwordToTest + SUBSTRING(CONVERT(NVARCHAR(MAX), @encryptedPassword), 2, 2)) 
    THEN 1 ELSE 0 END [MyPWDCompare] 
代碼