私の最初の質問は、文字列を2回ハッシュすることを聞いたことがあります(たとえば、sha1(sha1(password)))。2番目のハッシュは固定長であるため、本当ですか?
私の2番目の質問は、どちらが安全ですか?(var1とvar2は2つの文字列です):
- sha1(var1 + sha1(var2))
- sha1(var1 + var2)
それが最初のものである場合、それはパフォーマンスコストの価値がありますか?
私の最初の質問は、文字列を2回ハッシュすることを聞いたことがあります(たとえば、sha1(sha1(password)))。2番目のハッシュは固定長であるため、本当ですか?
私の2番目の質問は、どちらが安全ですか?(var1とvar2は2つの文字列です):
それが最初のものである場合、それはパフォーマンスコストの価値がありますか?
文字列を2回ハッシュすることで、衝突のリスクが高まりますが、これはセキュリティ面で悪いことです。
無限の量の入力が2128の可能な出力につながる代わりに、2つの128の可能な入力があり、おそらく2128未満の出力になります。
ハッシュする前にソルトアンドペッパーを使用すると、少なくとも入力が無限の可能性に保たれます。ハッシュを2回行うと、スクリプトの実行時間が長くなり、無限の入力のソースを維持しない限り、衝突のリスクが高まります。
どちらも非常に安全ではありません。車輪の再発明をしないでください。HMACはこのために設計されました。特に、上記の「単純な」実装とうまく相互作用しない特定のハッシュアルゴリズムの特定の弱点に関する問題を回避するための手順(パディングなど)が必要です。
さらに、ダブルハッシュはセキュリティを向上させるのに役立ちません。考えてみてください。せいぜい、あるランダムな値から別のランダムな値にマップすることになります。ただし、衝突が発生した場合、2番目のハッシュから得られた2つの値が等しい場合、衝突が発生してセキュリティが失われます。つまり、この方法で衝突を取り除くことはできませんが、衝突を得ることができます。
とはいえ、既存の原像攻撃はダブルハッシュに対しては機能しない可能性があります...しかし!彼らはまだ働くかもしれません。私はどちらを言う資格がありません、そしてあなたがここでこれを求めているなら、あなたはおそらくどちらでもないでしょう。確かに、今日のMD5で実用的な衝突攻撃は、ダブルハッシュによって妨げられることはありません。
暗号化を使用すると、安全に見えるが安全ではないものを作成するのは非常に簡単であるため、何十年にもわたる分析に耐えてきた実証済みのアルゴリズムを使用するのが最善です。
これでセキュリティが強化されるとは思えません。スクリプトの実行時間は長くなりますが、ハッシュに多くのセキュリティが追加されることはありません。誰かがあなたのハッシュを壊そうとするとき、彼らはvar1とvar2の正確な値を見つける必要はなく、同じハッシュをもたらすものを見つけるだけでよいことを覚えておいてください。
私は暗号化の専門家ではありませんが、私が知る限り、プロセスを遅くする以外に、値を複数回ハッシュしてもセキュリティは得られません。したがって、1000回ハッシュすると、攻撃(たとえば、辞書攻撃)が1000倍遅くなりますが、1回または2回ハッシュする場合、これはまったく関係ありません。
塩を1つだけ使用し、塩を使用しないと、簡単に解決できます。
これらのハッシュを大量に含む大きなテーブルがたくさんあるので、ソルトのない単一のハッシュをほとんど何も解決できません。
2番目のハッシュを追加しても、これらのテーブルは保存された値ですでに存在するため、あまり役に立ちません。
パスワードに追加される動的ソルトは、複数のハッシュよりもはるかに役立ちます。複数のハッシュを使用しても、実際にはそれほど多くは追加されません。
これについての私の感じは、あなたが鋼鉄のドアでレンガの壁を作っているということですが、他の壁は合板でできています。言い換えれば、パスワードのハッシュに必要なだけのセキュリティを注入することができますが、それでもシステムをクラックするためのはるかに簡単な方法があります。このようなことをあまり気にするよりも、セキュリティに対して幅広いアプローチを取る方がはるかに良いと思います。
var1 + var2は予想される状況で同じになるのでしょうか?つまり、その場合、最初の提案は問題ないはずです。ハッシュの衝突を避けるためです。コストに見合う価値があることについて、それはあなたが答えるべき質問です。コストに見合う衝突を回避しています。
shaアルゴリズムについては、実際に結果をスクランブルすることになっています。したがって、何度も適用しても良い結果が得られないはずです。また、「よりランダムな」入力に適用しても、より良い結果が得られるはずです。
文字列を複数回ハッシュすると、辞書攻撃の場合に攻撃者のタスクが複雑になり、ブルートフォース攻撃が「はるかに長く」なります。最初の質問は明確ではありませんが、2番目のハッシュの長さが固定されているため、複数のハッシュの安全性が低下することはありません。
ただし、複数のハッシュよりも重要なのは、セキュリティを強化するためにソルトの使用が不可欠です。
2番目の質問に関しては、2つのうちどちらが最も安全であるかを言うのはそれほど簡単ではないと思いますが、オプション2を使用するだけで十分だと思います。