2016-05-18 15 views
0

私は、SQL Serverでaes_256アルゴリズムを使用して自分のパスワードフィールドを暗号化しました。パスワードフィールドが暗号化されました。これで、ユーザーにログインし、サーバー上で検証プロセスを実行する必要があります。 私は検証プロセスのために書いたコードは次のとおりです。SQL Serverでパスワードの検証を行う方法は?

CREATE PROCEDURE Procedure_UserLogin 
    @username varchar(50), 
    @pwd varchar(50), 
    @responseMessage INT OUTPUT 
AS 
BEGIN 
    SET NOCOUNT ON 

    DECLARE @userID INT 

    IF EXISTS(SELECT TOP 1 username FROM userInfo WHERE [email protected]) 
    BEGIN 
     open symmetric key key1 
     decryption by certificate namecert 
     SET @userID=(SELECT username FROM userInfo WHERE [email protected] AND encryptedpwd=(ENCRYPTBYKEY(KEY_GUID('key1'),@pwd))) 
     IF (@userID IS NULL) 
      SET @responseMessage=0 /*INAVLID PASSWORD*/ 
     ELSE 
      SET @responseMessage=1 /*VALID USERNAME AND PASSWORD*/ 
    END 
    ELSE 
     SET @responseMessage=2 /*INVALID USERNAME*/ 
END 

しかし、応答は常に0である私がやっている何の間違いを教えてください?

+0

パスワードを暗号化しないでください:

だから、このようにそれを実装する代わりに、パスワードを暗号化しないでください。暗号化されたものはすべて解読できます。パスワードを暗号化してハッシュし、ハッシュをデータベースに格納します。ユーザーがログインすると、パスワードを暗号化してハッシュし、結果のハッシュとデータベースのハッシュ値を比較します。 – dbugger

+0

username(varchar)から@userID(Int)を選択しています。私はあなたが変換エラーを取得しないと驚いています。 –

+0

@dbugger、私はクライアント側に私の暗号化されたパスワードを持って来ていない、また、私はaes_256アルゴリズムは、ハッシュと塩で一緒に行われたような結果を生成すると思います。私が間違っているなら、私を訂正してください。 – Krisalay

答えて

0

短い答えは、ENCRYPTBYKEYが毎回異なる結果を出力し、テーブルに格納された暗号化された値が一定であるためです。

下記のスクリプトを実行して実際の動作を確認してください。

出力は10種類あります。しかし、encryptedpwdの表に対してSELECTステートメントを実行すると、毎回出力が同じになります。そのため、入力が正しい場合でも、スクリプトがユーザー入力を正しく認証することはできません。

さて、あなたは正しい、このような何かにこのライン

encryptedpwd=(ENCRYPTBYKEY(KEY_GUID('key1'),@pwd))) 

を変更するので考えるかもしれないことに基づいて?

DECRYPTBYKEY(KEY_GUID('key1'),encryptedpwd)) = @pwd 

あまり速くない。その理由は、DECRYPTBYKEYENCRYPTBYKEYの両方がVARBINARY(8000)を返しますが、ユーザー入力@pwdVARCHAR(50)です。したがって、入力のデータ型に一致するように出力を変換することなく、それらは常に異なっています。

CONVERT(VARCHAR,DECRYPTBYKEY(KEY_GUID('key1'),encryptedpwd))) = @pwd 

最後に、CLOSE SYMMETRIC KEY上のBOLは

オープン対称鍵がないセキュリティコンテキストにセッションにバインドされていると言います。オープンキーは、明示的にクローズされるかセッションが終了するまで、引き続き使用可能になります。

したがって、最後に明示的にキーを閉じることをお勧めします。

CLOSE SYMMETRIC KEY KEY1 
0

パスワードの検証をデータベースに委任することはできません。パスワードは、ハッシュで、BCrypt、PBKDF2、またはSCryptなどのアルゴリズムは遅く、通常これらのアルゴリズムはデータベースシステムでサポートされていません。塩漬けは必須で、特定のパスワードハッシュを検索することはできません。

// Get password-hash by user id 
SELECT hashedpwd FROM userInfo WHERE [email protected] 

// Verify the password within your application, which supports a safe algorithm 
// like BCrypt, PBKDF2 or SCrypt. 
// Take the salt from $existingHashFromDb or from a separate db-field. 
$isPasswordCorrect = password_verify($password, $existingHashFromDb); 
関連する問題