0

最近では、パスワードの保存に関連する問題のために、誰もが MD5 を非難しています。しかし、一度使用される可能性が高いものに認証のレイヤーを追加したい場合はどうでしょうか?

これは単なる架空の例ですが、ユーザーがパスワードをリセットできる機能があるとします。ユーザーに、クリックして新しい (ランダムに生成された) パスワードを設定できるリンクをメールで送信します。

私の現在の考えでは、プライベート ソルト値といくつかの識別変数を使用して MD5 ハッシュを生成し、それを使用してリンクを作成します。

この機能のソルトが「8b769a378411b705」だとしましょう (すべてのパスワード リセット リクエストに同じソルトを使用します)。その他の識別データは、ユーザー ID と、既に生成されたパスワード ハッシュのデータベース ID です。

salt = "8b769a378411b705" (private)
user_id = 123
pw_id = 456
code = md5(salt + " " + user_id + " " + pw_id)

なる

code = "692a71cd7da194145be209e40fcd3e92"

リンクの例: confirm_reset_password.php?user_id=123&pw_id=456&code=692a71cd7da194145be209e40fcd3e92

MD5 の問題を考慮して、これは安全と見なされますか? SHA-1 のように、使用を検討すべき別の一方向ハッシュはありますか?

パスワードを保存するためにSHA1でPBKDF2を使用してきましたが、その利点の一部は「遅さ」とハッシュの生成にかかる時間にあることを理解しています。このような目的でこれらの高品質のハッシュを生成することはできますが、逆効果になる可能性があると思います。なぜなら、(間違った) リクエストを大量に送信することでサーバーを簡単にひざまずかせることができるからです。ハッシュ(特に、多くの反復を使用しているため)。「高速な」アルゴリズムを持つことは、使い捨ての目的には適しているようですが、MD5 が依然として最良の選択であるかどうか疑問に思っています。

ありがとう!

4

2 に答える 2

5

まず第一に、MD5は多くの理由で安全でないと考えられています。まず第一に、md5のレインボーテーブルは今では巨大であり、おそらくハッシュスペースのほとんどをカバーしています。次に、ハッシュ衝突を作成できる(同じmd5出力を生成する方法で他のデータを偽装する)既知の攻撃があります。3番目は128ビットで、今日は短いです。

ここで質問に戻ります。セキュリティが重要なアプリをホストしていない場合、個人データ、医療データ、またはその他の「国の法律で管理されている」データを保存していない場合は、md5を使用できます。あなたのアルゴリズムに入ると、それは安全ではありませんが、それはまた非常に安全ではありません、それはあなたの選択です。追加する必要があるのは鮮度だけです。これは、メッセージの有効期間を示すある種のタイムスタンプです。次に、アルゴリズムはリプレイ保護を提供していません:)ユーザーがこのリンクを一度使用してブラウザに残した場合、攻撃者はこのリンクを再度使用してこのパスワードをリセットする可能性があります。それはかなり深刻な欠陥です。だからあなたはそれを修正したいかもしれません。

しかし、私はあなたに他のことを伝えたいと思います。絶対に必要でない場合は、CRYPTOを使用しないでください!私の謙虚な要求。パスワードリセットスキームは、暗号化なしで、リプレイ保護とはるかに高いセキュリティで簡単に実装できます。テーブル「pw_reset_hash」と「reset_validity」に列を追加し、それらに乱数と有効な日付を入力するだけです。ユーザーに乱数を発行し、使用後にフィールドをクリアして、事前に有効性を確認してください。そして出来上がり:)ランダムなので、おそらくどのハッシュアルゴリズムよりも安全です。ただし、安全なPRNGを使用してください。

于 2012-12-07T07:09:55.670 に答える
2

パスワードリンクを何かに基づいているのはなぜですか? それは安全性を低下させるだけです (漏洩する可能性のある既知のデータに基づいているため)! この場合、ランダムに生成されたコードの方がはるかに優れています。

于 2012-12-07T09:00:19.880 に答える