sha256
は高速であるため、安全ではありません。私が読んだほとんどのリンクはbcrypt
を提案しました。ただし、データが64の暗号学的にランダムなバイトである場合、攻撃者が何らかの方法で元の文字列を見つけることができることを知りたいだけです。
シナリオ
secret string
は64の暗号化ランダムバイトデータです。
ユーザーダウンロードsecret string
、ハッシュ化されたバージョンを保存します。いくつかの情報にアクセスしたい場合は、このデータをサイトにアップロードします。 (作業プロセスは変更できません、それは私たちがそれを保護する必要があるだけの安定したシステムです)
システムには1兆のsecret string
およびそれらのすべては、いくつかのハッシュアルゴリズムによって保護する必要があります。
攻撃者がsecret string
彼がすべてのハッシュにアクセスできた場合?
暗号ハッシュとパスワードハッシュを混同しています。暗号化ハッシュは入力を受け取り、ランダムに見える出力を提供します。 パスワードハッシュ はパスワードとソルトを受け取り、非常にゆっくりとランダムに見える出力を提供します。
ここで気になるのは プリイメージ攻撃 です。ハッシュy
を知っているため、攻撃者はh(x) = y
のような値x
を見つけられないようにする必要があります。 80ビットの複雑さは、一般的には「良い」と見なされています(「素晴らしい」とは言えませんが、国民国家などの資金のある攻撃者に対して脆弱である可能性があります)。これが意味することは、最良のプリイメージ攻撃が80ビットを超える複雑さを持つハッシュが必要であることです。
_MD5
_から始めましょう。これは古い暗号のポスターの子のようなものだからです。 _MD5
_で最もよく知られているプリイメージ攻撃は 116.9ビット であり、80をかなり上回っています。しかし、1trillionのシークレットを保護すると、攻撃者はいくつかの最適化を行います。
攻撃者がハッシュテーブル(および数テラバイトのRAM)を使用して、ハッシュがO(1)
の1兆のいずれかに一致するかどうかをチェックできると仮定します。 1兆個のシークレットを使用することで、ログによって1つのシークレットを解読する複雑さを軽減2(1012)≈40ビット。これにより、_MD5
_は約76ビットに下がります。それでもひどいことではありませんが、国民国家に直面しているのか、それとも長年これらを秘密にしたいのかと心配しています。
しかし、あなたは正しいことをしていて、_SHA256
_を使用しています。 _SHA256
_で見つけることができる最高のプリイメージ攻撃は、ステップを削減するためのものであり、それでも250ビットを超える複雑さでした。そこで、210ビットを超える複雑さを調べています。この場合、攻撃者は 物理に関するいくつかの問題 に遭遇します。
Bcryptなどの特殊なパスワードハッシュ関数は、比較的簡単に推測できる秘密の値を保護するように設計されています。つまり、より技術的に言えば、次の戦略が実際に成功する可能性が高いと推測できる秘密の値を意味します。
特殊なパスワードハッシュ関数は、#1はパスワードの現実に過ぎないことを当然のことと見なしているため、攻撃者を低速化することにより、#2で攻撃者を阻止しようとします。
ただし、強力な暗号ジェネレータからランダムにバイト文字列を均一に生成している場合は、#1は問題ではないので、特別なパスワードハッシュ関数は必要ありません。必要な唯一の防御策は、ランダムなバイト文字列を十分に長くすることです。 64バイトは512ビットであり、必要以上に大きくなります。実際、SHA-256を使用してセキュリティレベルを256ビットに固定している場合、32バイトを超えても何も得られません。しかし、実際には、16バイトの文字列(128ビット)で十分です。たとえば、私のブラウザがこのサイトに接続するために使用している暗号は、128ビットキーを使用しています。これは、ごく一般的なセキュリティレベルです。