64ビットハッシュを計算するためのAPIがCにあるかどうかを調べようとしています。MD5 / SHA1などの上位64ビットを使用している人がいることがわかりました。これは良いアプローチですか?
6 に答える
SipHashをMACとしてその形式で試すことができます(ただし、キー管理が必要です)。これは、短い入力メッセージに特に適しており、暗号化の強度を目的としています。AC実装も可能です。
ただし、誰かがファイルを積極的にいじり回していることを本当に気にしている場合は、64ビットのセキュリティに制限するべきではありません。十分な時間とリソースがあれば、今日のブルートフォースでも64ビットを壊すことができます。そのためにはSHA-256以上を使用する必要があります。または、逆に言えば、壊れたオプションをブラックリストに載せます。MD5(またはMD-それに関しては何でも)を使用しないでください。何らかの理由でSHA-256を使用できない場合にのみ、SHA-1を使用してください。
ハッシュを使用すると、(MACを使用するのではなく)キーを管理する必要がないという利点もあります。計算するハッシュは、監視しようとしているファイルとは別の場所に保管する必要があります。そうしないと、誰かがファイルを改ざんすると、チェックサムも簡単に改ざんされる可能性があります。
ハッシュの切り捨てが良いか悪いかについて
理論的には、最上位ビットと最下位ビットのどちらを使用するか、任意のパターンを使用してそれらを選択するかに関係なく、たとえば160ビットのハッシュ値を64ビットに切り捨てるのが間違っている理由がわかりません。私が考えることができるようにこれがより頻繁に行われない唯一の理由は効率です-小さな問題を処理するためのより効率的なアルゴリズムがあるのになぜ大きな銃を持ってくるのですか?
以下では、この目的のために暗号化された安全なハッシュを想定しています。汎用ハッシュはまったく別のトピックです。私が知っている限り、切り捨てられると攻撃対象領域が公開される可能性があります。
ただし、暗号的に安全なハッシュの場合、アルゴリズムが壊れていない限り、その出力は一様分布の確率変数の出力と区別がつかないと見なすことができます。
ここでこの値を切り捨てた場合、アルゴリズムの内部動作についてこれ以上の洞察は提供されません。それでも、確率の法則により、ブルートフォース(衝突またはプレイメージの検索)にかかる時間が短縮されるという単純な事実によって、セキュリティが弱まります。
たとえば、64ビットハッシュの衝突を見つけるには、平均で約2^32回の試行が必要です-BirthdayParadoxonは言います。出力を元の64ビットハッシュの最下位32ビットに切り捨てると、最上位32ビットを単に無視し、事実上の均一分布が残りを実行するため、時間内におよそ2^16の衝突が見つかります。 -そもそも32ビット値の衝突を検索し始めたようなものです。
それは悪い考えです。ハッシュ関数の値は、常に全体として解釈されることを意図しています。
「64ビットハッシュを計算する方法」の暗黙の質問の場合:使用目的は何ですか?暗号強度ハッシュ関数には64ビットが少なすぎることに注意してください。
CRCを使用して、ランダムな変更から保護します。
HMACを使用して、攻撃者がファイルを変更するのを防ぎます。HMACは、タグの生成と検証に必要な秘密鍵を使用します。HMACの結果は、基になるハッシュ関数(HMAC-SHA1の場合は20バイトなど)と同じ長さですが、頻繁に切り捨てられます。つまり、NIST SP 800-107 p.14によると、64-96ビットでほとんどのアプリケーションに十分です。
64ビットはハッシュとしては小さく、通常、ハッシュは全体として解釈されることを意図しています。
さて、あなたはこれらの64ビットを何のために必要としますか?答えは予想される使用法によって異なります。
最近のmd5はかなり壊れており、64ビットのセキュリティは非常に低いことに注意してください。
ランダムな変更に対する整合性チェックが必要な場合は、他の回答に示されている単純なチェックサムで十分な場合があります。
元のコンテンツを保証するために暗号強度が必要な場合は、64ビットが弱すぎます。MD5ではなく、途切れのないアルゴリズムの完全な値を使用することをお勧めします。SHA1は引き続き問題ありませんが、長期的なセキュリティを確保するには、SHA256を使用することをお勧めします。または、他の回答で述べられているように、HMACをさらに進めます。
暗号化ハッシュの切り捨てられた値を使用しても問題はありません。実際、SHA224 / 384は、異なる初期化ベクトルを使用してSHA256 / 512ハッシュを計算し、その結果を切り捨てることによって計算されます。ただし、これは暗号化ハッシュに対してのみ有効です。通常のチェックサムやテーブルハッシュには悪い考えかもしれません。
計算にはOpenSSLのAPIを使用してください(www.openssl.org)。