2

ここで説明するように、メールサーバーを実装しました。

それは完全にうまく機能します。私の興味は、ユーザーをデータベースに入力して認証することです。

ランニング:

INSERT INTO users (email, password) VALUES ('sales@example.com', ENCRYPT('password'));

複数回、ランダムなソルトを利用するため、暗号化されたパスワードに異なるハッシュが与えられます。つまり、同じパスワードでsales@example.comを3回入力すると、各ハッシュは異なります...

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

暗号化されたパスワードを適切に認証するために舞台裏で何が起こっているのかを完全に理解できるように、好奇心を満たすためだけにうまく機能するので、言うまでもなく問題はありません。

4

3 に答える 3

3

Postfix は、データベースからのパスワードを、salt (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
于 2012-10-03T12:45:03.723 に答える
2

man cryptを読んでください:それは戻り値の最初の2文字のソルトを返します。

したがって、ソルトが失われることはありません。暗号化された文字列をcrypt('pass'、$ first_two_chars_of_encrypted_value)の結果と比較できます。

于 2011-02-11T11:28:57.473 に答える
-3

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

ENCRYPT() は、システム crypt() を使用します。これは、最初の 8 文字のすべてまたは一部のみを使用でき、出力可能な 7 ビット ascii である必要があり、一般に DES ベースのハッシュを 1 ラウンド使用し、完全に移植できません。避けてください。

于 2011-01-07T02:35:44.050 に答える