0

ドメインの電子メールアカウントを管理するための簡単なRESTサービスの作成に取り組んでいますが、説明できない奇妙な動作に遭遇しました。

mysqlを使用して電子メールアカウントを認証しています。RESTサービスがmaildirを管理し、Webインターフェイスを使用して認証資格情報を挿入または更新します。ユーザーを挿入するためのクエリとパスワードを更新するためのクエリは、どちらもencryptmysqlコマンドを使用します。

奇妙なことに、挿入されたユーザーは、RESTインターフェースでパスワードが少なくとも1回変更されるまで、認証のために機能しません。これはencrypt、更新には正しい値を設定しているが、挿入には何か問題があることを意味します。

RESTサービス側のGET/POSTパラメータにすべてを記録しようとしましたが、データベース層で問題が発生しているようです。RESTサービスは、両方のエンドポイントでパスワードの正しいパラメーターをログに記録します。クエリの実行の一部が異なります。

私のクエリはそのように見えます(PythonでMySQLdbを使用):

ADD_USER = "INSERT INTO users (id,name,maildir,crypt) VALUES (%s,%s,%s,encrypt(%s));"

CHANGE_PASS = "UPDATE users SET crypt = encrypt(%s) WHERE id=%s"

繰り返しますが、(文字列として)渡されるのとまったく同じHTTPパラメータADD_USERで成功する不正なハッシュを入力しています。データ層が異なる暗号化を行う理由はありますか、それとも間違ったツリーを吠えていますか?CHANGE_PASScrypt

4

2 に答える 2

1

まず第一に:ENCRYPT()あなたがそれを助けることができるならば、パスワードのために使用しないでください。これは一種の制限があり(たとえば、パスワードの最初の8文字を超えるものはすべて無視されます)、特にMySQLクエリログがユーザーのパスワードをログに記録するため、特に安全ではありません。Pythonでパスワードハッシュを実行する方がはるかに優れています。これは、MySQLが実際のパスワードについて何も知る必要がないだけでなく、より強力なパスワードハッシュアルゴリズムを使用できることを意味します。

ENCRYPT()とはいえ、これは純粋なハッシュ関数ではないことに注意してください。2番目の引数としてsaltを渡さない限り、その結果は一定ではありません。パスワードをどのようにチェックしていますか?正しい解決策は次のようになります。

SELECT * FROM users WHERE <...> AND crypt = ENCRYPT(%s, crypt) ...

または、Pythonの場合:

row.crypt == crypt.crypt(users_input_password, row.crypt)
于 2012-05-16T17:39:12.313 に答える
1

ソルトなしで暗号化を使用すると、現在の時刻に基づいてソルトが使用されるため、呼び出すたびに異なるハッシュが取得されます。

mysql> select encrypt('test');
+-----------------+
| encrypt('test') |
+-----------------+
| 92SErC2PadiaQ   |
+-----------------+

mysql> select encrypt('test');
+-----------------+
| encrypt('test') |
+-----------------+
| A2jgxXgOJx7ls   |
+-----------------+

最初の2文字(標準の場合)はソルトです。確認したい場合は、古いパスワードをソルトとして使用します。最初の2文字以外はすべて無視されます。

mysql> select encrypt('test', 'A2jgxXgOJx7ls');
+----------------------------------+
| encrypt('test', 'A2jgxXgOJx7ls') |
+----------------------------------+
| A2jgxXgOJx7ls                    |
+----------------------------------+

より強力なパスワードが必要な場合は、特別なソルトを使用する必要があります。

mysql> select encrypt('test', '$1$12345678$') as md5;
+------------------------------------+
| md5                                |
+------------------------------------+
| $1$12345678$oEitTZYQtRHfNGmsFvTBA/ |
+------------------------------------+

mysql> select encrypt('test', '$5$0123456789abcdef$') sha256;
+-----------------------------------------------------------------+
| sha256                                                          |
+-----------------------------------------------------------------+
| $5$0123456789abcdef$Wm4jf6bGxEoelzY0H/fTvcw8Qcshq0hyLaRfZWtN8q. |
+-----------------------------------------------------------------+

mysql> select encrypt('test', '$6$0123456789abcdef$') as sha512;
+------------------------------------------------------------------------------------------------------------+
| sha512                                                                                                     |
+------------------------------------------------------------------------------------------------------------+
| $6$0123456789abcdef$vNATSYYTivQfXwPTUT4q.sRFLs/sgxDXaPipzRlX3WOO4r1NcR.Og5OoU2Cd2agm1WA3pCJ30JU4EKMxpZaDy/ |
+------------------------------------------------------------------------------------------------------------+

だからそれはすべてあなたが使う塩に依存します。無塩のハッシュは絶対に使用しないでください。

于 2012-05-16T17:58:06.053 に答える