2011-12-14 7 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に変換することはできません。

これは、これは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] 
を実行するコードである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] 

を実行するコードであります

関連する問題