3

私は、データを識別するいくつか(<10)の情報を取得し、それらを組み合わせて1つのハッシュを生成することにより、Key-Valueデータのキーを作成しています。このために、私はCryptoPPのSHA256::Update関数を使用してきました。この関数を使用すると、一度にピースを追加できます。

#include "sha.h"
...
byte outputBuf[CryptoPP::SHA256::DIGESTSIZE];
CryptoPP::SHA256 hash;
hash.Update(pData1, lenData1); // pData* can point to int, double or std::string
hash.Update(pData2, lenData2);
...
hash.Final(outputBuf);

呼び出しの順序が重要であることに気づきましたUpdate(つまり、2つのUpdateステートメントの順序を変更すると、異なるハッシュが取得されます)。代わりに、これを注文に依存しないようにしたいと思います。それで:

  • CryptoPPはこれを行う方法を提供しますか?
  • そうでない場合は、別のアプローチを提案できますか?xorこれまでのところ、パラメータを組み合わせるために使用するとうまくいくと思います。1つの問題は、2つのデータが同じである場合、それらがキャンセルされることです。これに関する問題を予見できますか?
4

1 に答える 1

2

xor が衝突の数を増やすというコメントは、 と が異なる入力であると考える場合に{1, 2}のみ{2, 1}当てはまります。そうしないと、順序に依存しないハッシュが必要ないためです。同じ入力を提供しているのでh({1, 2}) = h({2, 1})、衝突はありません。

最も簡単な解決策は、お気に入りのハッシュ関数を使用するよりもソートすることです。ハッシュ関数と同じくらい安全です (気になる場合は、crypto.stackexchange.com で確認してください)。

Xoring ハッシュは、2 つの等しい要素が相殺されるため、間違いなく悪い考えです。それらを追加する方がはるかに優れていますが、2 つの等しい要素では、最下位ビットがゼロになります (このような要素が 4 つある場合、2 つのビットはゼロになります)。これは許容できる場合があります。

そのような方法は、衝突をはるかに速く見つけることができるため、かなり安全ではないことに注意してください(要求に応じて証明します)。セキュリティが必要な場合とそうでない場合がありますが、安全な方法を発明しようとしないでください。実際には不可能なためです (よく知られているすべてのハッシュ関数には、その背後に何ヶ月もの分析があります)。

于 2017-06-07T14:24:36.743 に答える