2012-04-02 31 views
4

ユーザーパスワードにAES暗号化(AES_ENCRYPT)を使用しようとしていますが、さまざまな問題が発生しました。AES_ENCRYPTの使い方は?

INSERT INTO user VALUES (
    '15', 
    'John', 
    'Doe', 
    '123 Fake St.', 
    AES_ENCRYPT('mypassword', 'mysalt'), 
    'mysalt' 
) 

塩は、実際のケースでは、ランダムな文字列を次のようになります。

これは、私は、データベースに新しいユーザーを保存するために使用するSQLクエリがあります。

正常に動作します。つまり、元のパスワードを取得できます。この例では、AES_DECRYPT(user.password, 'mysalt') WHERE user.id = 15mypasswordを取得します。しかし、私はいくつかのことを見落としているかもしれません。

  • パスワードと一緒に塩分を保存するのは安全ですか? security through obscurity thingを除きます。

  • ハッシュされたパスワードを保存するのに最適なフォーマットは何ですか?
    VARBINARYを使用していますが、格納されている文字列は8�p�����_�Z�\のように見えます。

  • 最後に、パスワードはどれくらいの期間で、どれくらいの時間が塩であるべきですか? の塩はどうですか?

おかげ

+1

パスワードを暗号化したくない場合、[PBKDF2](http://en.wikipedia.org/wiki/PBKDF2)、[bcrypt](http: /en.wikipedia.org/wiki/Bcrypt)、[scrypt](http://en.wikipedia.org/wiki/Scrypt) - http://security.stackexchange.com/a/6415/27154を参照してください。 –

+1

@ MarkFox私はずっと前にこの質問をしました。最近私は[PHPass](http://www.openwall.com/phpass/)を使用していますが、正しくリコールすればbcryptを使用します。 – federicot

答えて

6

通常、パスワードを逆暗号化する必要はありません。その能力が本質的にシステムのセキュリティを低下させる。代わりに、不可逆的なハッシュ関数を使用してください。私も常にパスワード検証時に知られている他のデータに圧延することによって任意の使用であることからバルクrainbow tablesをイライラしている

SHA2 (CONCAT (user.name, user.password, 'some salt', user.id), 256) 

:私は、文字列の結果を生成するSHA-256(以上)を示唆しています。

SHA2には、MySQL 5.5以降が必要です。以前のバージョンを使用している場合は、SHA1()MD5よりもはるかに優れ、一般的にほぼ同じくらい良いです、そして、AESなど

+1

良い摂取、不可逆的なハッシュ関数はおそらくこの場合には良いでしょう。 1つの最後の質問ですが、ハッシュされたパスワードと共に塩を保存する必要がありますか?そして、それはすべてのパスワードのために異なる塩でなければなりませんか? – federicot

+0

@ジョンドー:あなたが塩を使っているなら、パスワード確認時にそれが何であるかを知るための何らかの方法が必要です。それを保存するのはかなり簡単な方法です。また、 'username'と' id'を含めるという私の提案を使用する場合、塩の重要性はそれほど重要ではありません。それらがなければ、ユーザーあたりの塩分の値が一番高いことを強くお勧めします。さもなければ、すべてのユーザーのために単一のレインボーテーブルを使用することができます。 – wallyk

0

あなたは、データベース内のパスワードを暗号化しますが、データベース内のパスワードのプレゼンテーションを保存しないでください。

長らく説明するとthis questionを参照してください。