パスワード暗号化の方法に賛否両論があるかどうか疑問に思っています...通常、データベースに新しいユーザーを挿入する前に、phpを使用し、md5を使用してパスワードを暗号化します。最近プロジェクトを継承しましたが、SQL挿入クエリでPASSWORD()を使用して暗号化しています。それで、今、私は一方を他方よりも使用することに利点があるかどうか疑問に思っていますか?
6 に答える
以下のMySQLドキュメントをPASSWORD
参照してください。
PASSWORD()関数は、MySQLサーバーの認証システムによって使用されます。独自のアプリケーションで使用しないでください。そのためには、代わりにMD5()またはSHA2()を検討してください。アプリケーションでのパスワードと認証の安全な処理の詳細については、RFC 2195のセクション2(チャレンジ/レスポンス認証メカニズム(CRAM))も参照してください。
そのメモの下に、その機能に依存しない非常に良い理由が1つあります。
PASSWORD()を呼び出すステートメントは、サーバーログまたは〜/ .mysql_historyなどの履歴ファイルに記録される場合があります。つまり、プレーンテキストのパスワードは、その情報への読み取りアクセス権を持つすべてのユーザーが読み取ることができます。
パスワードは通常、ソルトハッシュ(SHAなど)とともに保存するのが最適です。安全なパスワードの保存に関するいくつかの便利なリンクをリストした回答があります。
誰かがパケットをスニッフィングしていて、あなたがPASSWORDを使用している場合、その人は「INSERT INTO USERS VALUES('username'、PASSWORD('secret'))」を見ることができます。MySQLにもMD5関数があると思いますが、同じ理由で使用しないでください。
SHA-1とMD5が侵害されているため、ソルト値(おそらくユーザー名に基づく)でSHA-256を使用することをお勧めします。ソルトは基本的にパスワードに付けられた文字列であり、レインボーテーブルを使用してパスワードを把握するのを防ぎます。
SHAxとMD5はどちらも暗号化ではなく、ハッシュです。
実際の暗号化については、mcryptライブラリをご覧ください。
http://php.net/manual/en/book.mcrypt.php
編集:ircmaxellが指摘しているように、パスワードは暗号化するべきではなく(パスワードマネージャーを構築している場合を除く)、ランダムなソルト値で一方向にハッシュする必要があります。(例:SHA1)
MySQLではなくPHPを使用して実行している場合、パスワードを保護するためにMD5を使用しないことをお勧めします。
http://php.net/manual/en/function.md5.php
代わりに、次のcrypt
関数を使用してください。
ハッシュ値(PASSWORD()がパスワードに対して返す値)がわかっている場合にクリアテキストパスワードを指定しないようにするには、キーワードPASSWORDの前にハッシュ値を指定します。
CREATE USER 'jeffrey'@'localhost'
IDENTIFIED BY PASSWORD '*90E462C37378CED12064BB3388827D2BA3A9B689';
ウィキによると:
1996年に、MD5の設計に欠陥が見つかりました。