なぜパスワードを暗号化するのですか?パスワードを盗聴から守るためですか?データベースに保存した後にパスワードを保護するには?両方とも?または他の理由で?
私は ブログ記事 をその主題について具体的に書いた。概要:パスワードをハッシュする必要があります(「暗号化」はその正しい用語ではありません)。パスワードを検証するために必要なものをサーバーが格納するデータベースへの読み取り専用アクセスを取得する攻撃者から保護する必要があります。
パスワードの暗号化は通常、盗聴から保護するために使用されます。たとえば、適切に設定されたWebサイトにログインすると、SSLによりパスワードが暗号化されます。盗聴者が転送中にパスワードを奪うことはできません。
暗号化されたパスワードをデータベースに保存することに関しては、これを行う十分な理由がなく、自分が何をしているかを理解していない限り、これは悪い考えです。ダイジェスト(sha-256(salt + password)など)を保存する方がはるかに優れています。その理由は、暗号化キーはどこに保存されているのですか?サーバー上。そのため、ハッカーがマシンに侵入してデータベースを盗むことができる場合、ハッカーは暗号化キーを盗んですべてのパスワードを簡単に復号化できます。
ただし、データベースに暗号化されたパスワードを格納するための有効な例の1つは、パスワードマネージャーです。
パスワードを暗号化する代わりに、ハッシュを使用します。どうして?まあ、何かを暗号化するには、別のキー(別のパスワード)が必要です。では、そのキーをどのように安全に保存しますか?あなたはループに閉じ込められます。
したがって、ハッシュ関数を使用します。インターネットを見回すと、MD5、SHA1、SHA256、HMAC、ソルトハッシュなどの関数を使用するための数百万の記事や提案が見つかります。リストは長いですが、使用しないでください。
PBKDF2 をユーザーごとに64ビットソルトで使用します(おそらく 暗号化疑似乱数ジェネレータ から派生)。他のハッシュ関数よりもPBKDF2を使用する理由の1つは、低速であるためです。つまり、ブルートフォース攻撃に対してあまり脆弱ではありません。ユーザーごとのソルトは Rainbow table 攻撃からの保護に役立ちます。
だから、あなたは保存します
USERNAME, PBKDF2DIGEST, SALT
あなたのSQLテーブルのレコードとして、あなたは行ってもいいです!
(私はbcryptよりもPBKDF2のほうが使いやすく、したがってよりテストされていると感じるので)
正しい方法は、パスワードを(暗号化されていても)保存するのではなく、パスワードのソルトハッシュを保存することです。
他のシステムにログイン/アクセスするために、パスワードを保存する必要がある場合があります。次に、それを暗号化して保存し、誰かが(SQLインジェクションなどを介して)入手した場合、そのシステムを使用してそのシステムにアクセスできないようにします。
上記のThomas Porninの回答に従ってください。保存する前にパスワードをハッシュ+ソルトする必要があることを知っているだけでは不十分です。それはあなたを困らせるのにちょうど十分な情報です。
たとえば、1ラウンドのmd5ハッシュは非常に弱く、8 GPUセットアップと .1億ハッシュ/秒 の場合、英数字で構成されたすべての8桁のパスワードを15時間で解読できます。
ThomasがbcryptとPBKDF2と、それらを使用する背景について話しています。
ハッシュは、データベース内のパスワードを保護するために使用されます(LinuxのようなOSでも、アプリでも)。レインボーテーブルなどの攻撃からハッシュを保護するために、ハッシュにソルト値が追加されます。ソルトの値はユーザーごとに一意であるため、ソルトはレインボーテーブルの攻撃を非現実的にします。
パスワードを盗聴から保護するには、通常暗号化を使用します。たとえば、SSL経由でパスワードを送信します。