この質問は、技術的なセキュリティの質問よりもセキュリティポリシーの詳細です。
何年も前に、asp.netサイトを開発し、フォーム認証を実装し、ユーザーパスワードをMD5ハッシュとして保存しました。基本的なセキュリティニュースをたどると、MD5がもはや役に立たなくなっていることは明らかです。現在のユーザーを処理するための2つの考えられる計画が表示されます。
何かご意見は? 3つ目のオプションが欠けていますか?
注:OpenIDは大好きですが、このサイトではオプションではありません
これと同じ問題を2回解決する必要がありました。
どちらの場合も、オプション3ではなくオプション3を使用しました。ユーザーの次のログイン時に、パスワードを使用して新しいハッシュを生成し、古いハッシュを置き換えます(古いハッシュと照合して確認した後)。
ソルトを追加する場合、これはかなり簡単なことでした。私が行ったのは、デフォルトで全員が ""(空の文字列)のソルトでした。これは、連結して、結果のハッシュに影響を与えることなくハッシュすることができました。認証されたら、ユーザー用に新しいソルトを生成し、パスワードを再度ハッシュ化して、新しい結果を保存しました。
MD5からSHA-512へのアップグレードは少しトリッキーでしたが、テーブルのhasの文字列の長さを調べるだけで(新しいハッシュに新しい列を使用せず、より長いハッシュに対応するために既存の列を拡張しただけです) )使用するアルゴリズムを指定して、ユーザーを適切に認証できます。認証された後、それらがまだ古いハッシュ上にある場合、新しいハッシュを計算し(また、新しい塩を生成する機会を得て)、それを保存します。
もちろん、どちらの場合でも、最終的には「古いスタイル」のパスワードがまだ存在する状況に最終的に遭遇しました。適切な時間(6か月など)待った後、新しいスタイルが採用されてからログインしていないユーザーを「非アクティブ」と判断します。新しい完全にランダムなパスワードを生成して保存します(新しいスタイルを使用)もちろん、それを保存することもできます。また、戻ってきた場合は、パスワードリセットメカニズムを使用してアクセスを回復する必要があります。 (または、現状のままにしますが、古いスタイルのコードを削除するだけで事実上無効化します。)これらのユーザーに電子メールを送信し、ログインしてセキュリティアップグレードを完了するように依頼することもできます。現在のパスワードを無効にする前のアカウント。
もちろん、このアプローチには認証ルーチンに追加のコードが含まれますが、それは一時的なものです-すべてのユーザーがアップグレードすると(ログインするか、前の段落のように「強制」されるかによって)、責任のあるすべてのコードを削除できますアップグレードを実行します。セキュリティのアップグレードが完了しました。ほとんどのユーザー(およびすべての通常のユーザー)は何も気づいていません。
これは特定の質問に対応していないという点で真の答えではありませんが、IDを統合する別のオプションを追加することに同意します。つまり、それがOpenID、Facebook、Googleなど、だれであろうと...ユーザーの資格情報を安全に保存するための最良のオプションは、単に実行しないことです。
TL; DR:可能な場合は、認証を統合します。