27

イントラネットサイトにいくつかの変更/更新を実装するように依頼されました。彼らがそれを呼ぶように、それを「将来の保証」にします。

パスワードはMD5アルゴリズムを使用してハッシュされていることがわかりました。(システムは2001年から存在しているので、当時は適切でした)。
ここで、ハッシュアルゴリズムをより強力なもの(BCrypt-hashまたはSHA-256)にアップグレードしたいと思います。

私たちは明らかに平文のパスワードを知らず、ユーザーベースの新しいパスワードを作成することはオプションではありません*)

だから、私の質問は:

プレーンテキストのパスワードにアクセスせずにハッシュアルゴリズムを変更するために受け入れられている方法は何ですか?
最善の解決策は、完全に「舞台裏」にある解決策です。

*)試してみました。彼らを説得しようとした、「パスワード年齢」の議論を使用した、コーヒーで賄賂を試みた、ケーキで賄賂を試みた、など。しかし、それはオプションではありません

更新
私は問題を解決するためのある種の自動魔法の解決策を望んでいましたが、どうやら「ユーザーがログインするのを待ってから変換する」以外の選択肢はないようです。

まあ、少なくとも今は他に利用できる解決策はありません。

4

7 に答える 7

33

まず、DBにフィールドを追加して、パスワードがMD5または新しいアルゴリズムを使用しているかどうかを識別します。

まだMD5を使用しているすべてのパスワードの場合:

-ログインプロセスで、ユーザーが入力したパスワードを確認します。ユーザーが送信したパスワードを一時的にメモリに保存し(セキュリティの問題はありません。すでにメモリにあるため、ここではセキュリティ上の問題はありません)、通常のMD5ハッシュを実行して保存されたハッシュと比較します。

-正しいパスワードが指定された場合(既存のハッシュと一致する場合)、一時的に保存されたパスワードを新しいアルゴリズムで実行し、その値を保存し、新しいフィールドを更新して、このパスワードが新しいアルゴリズムに更新されたことを確認します。

(もちろん、新しいユーザー/新しいパスワードには新しいアルゴリズムを使用するだけです。)

于 2009-10-07T19:51:30.687 に答える
7

私は暗号化の専門家ではないため、このオプションについて完全にはわかりません。ここのどこかで間違っていたら訂正してください!

デイブP.が明らかに最良の選択肢だと思います。

... しかし。自動魔法の解決策があります-古いハッシュ自体をハッシュします。つまり、現在のハッシュを取得し、より強力なアルゴリズムを使用して再度ハッシュします。私が理解している限り、ここではハッシュ長からセキュリティが追加されることはなく、新しいアルゴリズムの暗号化の複雑さが追加されるだけであることに注意してください。

もちろん、問題は、パスワードのチェックで両方のハッシュを実行する必要があることです。また、新しいパスワードについても同じことを行う必要があります。これは、まあ、かなりばかげています。Dave P.のような同様のスキームを使用したい場合を除いて、最終的には新しいハッシュアルゴリズムを使用してシングルハッシュパスワードに戻るように説明されています...その場合、なぜこれを気にする必要がありますか?(もちろん、派手な「すべてのパスワードのセキュリティが向上し、すぐに適用されます!」で使用できます。比較的真っ直ぐな顔で、企業のスーツのプレゼンテーションに使用できます...)

それでも、段階的な移行フェーズなしで、現在のすべてのパスワードにすぐに適用できるオプションです。

しかし、男の子、ああ男の子、後でそのコードを見て大笑いする人です!:)

于 2009-10-13T08:41:11.653 に答える
3

passwordChange日時フィールドをデータベースに追加します。

すべてのパスワードはX日より前に設定されています。MD5を使用して確認してください

すべてのパスワードはX日以降に設定され、BCryptなどを使用して確認してください。

于 2009-10-07T19:44:59.950 に答える
3

ハッシュフィールド自体(「MD5:d41d8cd98f00b204e9800998ecf8427e」など)または別の列に保存できます。この列には、そのハッシュの作成に使用されたアルゴリズムがあります。次に、パスワードをチェックするときに正しいアルゴリズムを使用するようにログインプロセスを変更する必要があります。当然、新しいパスワードはすべて、新しいアルゴリズムを使用してハッシュされます。うまくいけば、パスワードは最終的に期限切れになり、時間の経過とともにすべてのMD5ハッシュが段階的に廃止されます。

于 2009-10-07T19:45:43.663 に答える
3

プレーンテキストのパスワードがわからないので、暗号化バージョンを示すフィールドを作成する必要があるかもしれません(のようにPasswordVersion bit default 0

次回ユーザーがログインしようとするときは、今日と同じように、現在のアルゴリズムバージョンを使用してハッシュされたパスワードを確認してください。一致する場合は、もう一度ハッシュしてフィールドを更新しPasswordVersionます。

PasswordVersionうまくいけば、より大きな列は必要ありませんbit。=)

于 2009-10-07T19:46:16.280 に答える
3

パスワードデータベースを変更して、次の3つのアイテムを保存する必要があります。

  1. アルゴリズム識別子。
  2. サーバーが最初にパスワードハッシュを計算して保存するときにサーバーによって選択されるランダムなソルト文字列。
  3. 指定されたアルゴリズムを使用したsalt+passwordの連結のハッシュ。

もちろん、これらは区切り文字を使用して1つのテキストフィールドにまとめて格納できます。

「SHA256:this-is-salt:this-is-hash-value」

次に、既存のエントリを空のソルトと古いアルゴリズムを含む値に変換します

「MD5::this-is-the-old-md5-hash-without-salt」

これで、既存のすべてのパスワードエントリを確認するのに十分な情報が得られましたが、新しいエントリを確認することもできます(使用されたハッシュ関数がわかっているため)。このプロセス中にパスワードを使用できるようになるため、既存のユーザーが次にログインするときに、古いエントリを新しいアルゴリズムに変換できます。

  1. データベースがソルトなしの古いアルゴリズムを使用していることを示している場合は、最初に、パスワードのMD5ハッシュが一致することを確認して、古い方法でパスワードを確認します。そうでない場合は、ログインを拒否します。
  2. パスワードが確認された場合は、サーバーにランダムなソルト文字列を選択させ、ソルト+パスワードのSHA256ハッシュを計算し、パスワードテーブルエントリを新しいアルゴリズム、ソルトとハッシュを指定する新しいものに置き換えます。
  3. ユーザーが再度ログインすると、新しいアルゴリズムを使用していることがわかります。そのため、salt + passwordのハッシュを計算し、保存されているハッシュと一致することを確認してください。

最終的に、このシステムが適切な時間実行された後、変換されていないアカウントを無効にすることができます(必要に応じて)。

各エントリに固有のランダムなソルト文字列を追加すると、このスキームはレインボーテーブルを使用した辞書攻撃に対してはるかに耐性があります。

于 2009-10-07T21:06:32.190 に答える
0

最良の答えは、実際の暗号化の専門家からのものです https://paragonie.com/blog/2016/02/how-safely-store-password-in-2016#legacy-hashes

この投稿は、どのハッシュを使用すべきかを説明するのにも役立ちます。2016年と表示されていても最新です。疑わしい場合はbcryptを使用してください。

ユーザーアカウントテーブルに、legacy_password(または同等のもの)という列を追加します。これは単なるブール値です

既存のパスワードハッシュの新しいより強力なハッシュを計算し、データベースに保存します。

レガシーフラグを処理するように認証コードを変更します。

ユーザーがログインしようとするときは、最初にlegacy_passwordフラグが設定されているかどうかを確認してください。そうである場合は、最初に古いパスワードハッシュアルゴリズムを使用してパスワードを事前にハッシュしてから、パスワードの代わりにこの事前にハッシュされた値を使用します。その後(md5)、新しいハッシュを再計算し、新しいハッシュをデータベースに保存して、プロセスでlegacy_passwordフラグを無効にします。

于 2019-05-26T18:21:12.127 に答える