postfix + mysql encrypt()、塩をランダム化することでパスワードをどのように確認しますか?
-
30-09-2019 - |
質問
口述のようにメールサーバーを実装しました ここ.
それは完全に正常に機能します。私の好奇心は、ユーザーをデータベースに入力して認証することを中心に展開します
ランニング:
INSERT INTO users (email, password) VALUES ('sales@example.com', ENCRYPT('password'));
複数回、暗号化されたパスワードがランダム塩を使用しているため、異なるハッシュが得られます。 IE sales@example.comを3回入力した場合、同じパスワードで各ハッシュが異なります...
これに対する私の質問は、ユーザーがメールクライアントを介してログインしたときにPostfixサーバーが実際にパスワードを認証できるのはどのようにできますか?
たとえば、それが正常に動作するため、私の好奇心を満たすためだけに問題はありません。そうすれば、暗号化されたパスワードを適切に認証するために舞台裏で何が起こっているのかを完全に理解できます。
解決
Man Cryptを読む:戻り値の最初の2枚のcharで塩を返します。
したがって、塩は失われていません。暗号化された文字列をCrypt( 'pass'、$ first_two_chars_of_encrypted_value)の結果と比較できます。
他のヒント
Postfixは、データベースのパスワードを塩(DBのパスワード)で行われた新しい暗号化と比較します。
暗号化する:
update user set password = ENCRYPT('1234') where id = 1
パスワードを確認するには:
SELECT u.* FROM user u where u.email ='admin@dominio.com'
and ENCRYPT('1234', u.password) = u.password
塩を強制するには、暗号化(「パス」、「塩」)を使用する必要があります。そうしないと、塩は永遠に失われ、回復する方法がありません。それなしではかなり無意味な機能。ただし、セキュリティが最小限であるため、使用するのはひどい機能です。代わりにパスワード()またはold_password()を使用します。
Encrypt()は、最初の8文字のすべてまたはみを使用する場合があるシステムCrypt()を使用し、印刷可能な7ビットASCIIである必要があり、通常1ラウンドのDESベースのハッシュを使用し、完全に輸送できません。それを避けてください。