たとえば、128ビットの暗号化キーを生成するために、または他のアプリケーション(たとえば、ファイル整合性検証)で、より少ないストレージ領域を消費するために、128ビットのハッシュ出力が必要である/優先されると仮定します。
私は新しい/標準/壊れていない128ビットのハッシュ関数を知りませんので、SHA256を使用する必要があるようです。
SHA256出力を128ビットに切り捨てることはできますか?このような切り捨てられたハッシュには、128ビットハッシュと同等のセキュリティがありますか?既知の脆弱性のない128ビットのハッシュを意味します。確かにMD5ではありません!
私はこれを達成する方法のアイデアを持っています:
MD5(Truncate128(SHA256_hash))
これがセキュリティにメリット/デメリットをもたらすかどうかはわかりません。
SHA-256は名目上256ビットの出力を提供しますが、出力が128ビットに切り捨てられた場合の弱点は、当然ながら、短い出力長に固有の弱点を除いてはわかりません。例えば衝突抵抗が実行不可能から低下2128 可能な(しかし難しい)264。
これはハッシュ関数(*)の一般的なプロパティではありませんが、SHA-256の定義方法からいくぶん「明白」です。特に、NISTがSHA-224(224ビット出力のハッシュ関数)を定義した場合、SHA-256を取り、異なる初期化ベクトルと切り捨てられた出力しかありませんでした。
(*)与えられた安全なハッシュ関数は、切り詰められた場合、ひどく悪くなることはないかもしれませんが、それでも予想よりわずかに悪い可能性があります。 SHA-256の場合、切り捨ては安全に見えます。
トムが言ったように、衝突を合理的に回避するには128ビットで十分なので、整合性のためにSHA-256出力を128ビットに切り捨てることができます。
ただし、SHA-256などのハッシュ関数は、キーの生成やファイルの信頼性(整合性のみ)には適していません。
鍵を生成する場合は、PKBDF2やscryptなどを使用してください。ファイルを認証する場合は、HMAC関数(SHA-256に依存する可能性があります)を使用します。
出典:Courseraの暗号化の概要。