SHA-256から出てくるエンコードされた文字列をサブストリングするバイト配列とサブストリングの切り捨て
質問
私は、アルゴリズムを使用する際に関連するリスクをハッシュすることに慣れていないため、以下の質問で受け取った回答について質問があります。 。 。
ハッシュ値がASCIIにエンコードされた場合、16のASCI文字内に収まる必要があるというコメントに基づいて、最初に解決策が暗号化ハッシュ関数を選択します(SHA-2ファミリーにはSHA-256、SHA-384、およびSHA-が含まれます。 512)次に、選択したハッシュ関数の出力を96ビット(12バイト)に切り捨てます。つまり、ハッシュ関数出力の最初の12バイトを保持し、残りのバイトを破棄し、ベース64エンコードの切り捨てられた出力をエンコードします。 16個のASCII文字(128ビット)に、96ビット強力な暗号化ハッシュを効果的に生成します。
ベース64エンコードの文字列を16文字にサブストリングしている場合、ハッシュ関数の最初の12バイトを保持し、ベース64エンコードを保持することと根本的に異なりますか?もしそうなら、誰かがバイト配列を切り捨てるために(コードの例を提供する)説明してもらえますか?
36,000以上の異なる値に対して完全なハッシュ値のサブストリングをテストしましたが、衝突はありませんでした。以下のコードは私の現在の実装です。
あなたが提供できる助け(そして明確性)をありがとう。
public static byte[] CreateSha256Hash(string data)
{
byte[] dataToHash = (new UnicodeEncoding()).GetBytes(data);
SHA256 shaM = new SHA256Managed();
byte[] hashedData = shaM.ComputeHash(dataToHash);
return hashedData;
}
public override void InputBuffer_ProcessInputRow(InputBufferBuffer Row)
{
byte[] hashedData = CreateSha256Hash(Row.HashString);
string s = Convert.ToBase64String(hashedData, Base64FormattingOptions.None);
Row.HashValue = s.Substring(0, 16);
}
オリジナル投稿](http://stackoverflow.com/questions/4340471/is-there-a-hash-algorithm-that-roduces-a-hash-size-of-64-bits-in-c)
解決
いいえ、違いはありません。ただし、配列を切り捨てる代わりに、配列の最初の12バイトのBase64文字列を取得する方が簡単です。
public override void InputBuffer_ProcessInputRow(InputBufferBuffer Row) {
byte[] hashedData = CreateSha256Hash(Row.HashString);
Row.HashValue = Convert.ToBase64String(hashedData, 0, 12);
}
ベース64エンコーディングは、各文字に6ビットを配置するだけなので、3バイト(24ビット)が4文字になります。偶数3バイトの境界でデータを分割している限り、偶数4文字の境界で文字列を分割するのと同じです。
これらの境界間でデータを分割しようとすると、base64文字列はフィラーデータでパディングされ、次の境界までパディングされるため、結果は同じではありません。
他のヒント
切り捨ては追加するのと同じくらい簡単です Take(12)
ここ:
変化する
byte[] hashedData = CreateSha256Hash(Row.HashString);
に:
byte[] hashedData = CreateSha256Hash(Row.HashString).Take(12).ToArray();