2011-01-06 2 views
2

私はhereと指定してメールサーバを実装しました。Postfix + MySQL ENCRYPT()、パスワードをランダム化してパスワードをどのように確認しますか?

正常に動作します。私の好奇心は、周りのデータベースにユーザーを入力し、それらに

の認証を中心に展開実行:

INSERT INTO users (email, password) VALUES ('[email protected]', ENCRYPT('password')); 

複数回は、ランダムな塩を利用して暗号化されたパスワードの異なるハッシュを与えるだろう。私。私が[email protected]を同じパスワードで3回入力すると、それぞれのハッシュは異なります...

私の質問は、どのようにしてユーザーがログインしたときに実際にパスワードを認証できるかです。メールクライアント?

私の好奇心を満たすためにはうまくいきますので、暗号化されたパスワードを適切に認証するために何が起こっているのかを十分に理解することができます。

答えて

2

man cryptを読んでください:戻り値の最初の2文字にsaltを返します。

塩が失われないので、暗号化された文字列をcrypt( 'pass'、$ first_two_chars_of_encrypted_value)の結果と比較できます。

-3

ENCRYPT( 'pass'、 'salt')を使用して塩を強制する必要があります。そうしないと、塩は永遠に失われ、回復する方法はありません。それなしのかなり無意味な機能。セキュリティは非常に小さいので、使用するのはひどい機能です。代わりにPASSWORD()またはOLD_PASSWORD()を使用してください。

ENCRYPT()は、すべての、または最初の8文字のみを使用するシステムcrypt()を使用し、印刷可能な7ビットASCIIでなければならず、通常DESベースのハッシュの1ラウンドを使用します。避けてください。

+1

塩が永遠に失われた場合、その後、彼の設定は、実際に動作しない暗号化する

。私は暗号化が良い解決策のようには聞こえないとは思っていますが、何か他のものを受け入れるためにpostfixを入手する方法はありますか? – Dwayne

3

Postfixは、データベースからのパスワードとsaltで行われた新しい暗号化(dbからのパスワード)を比較します。

update user set password = ENCRYPT('1234') where id = 1 

を、パスワードをチェックするために:

SELECT u.* FROM user u where u.email ='[email protected]' 
and ENCRYPT('1234', u.password) = u.password 
関連する問題