0

私はハッシング アルゴリズムとそれらを使用する際のリスクに精通していないため、以前の質問で受け取った以下の回答について質問があります。. .

ハッシュ値が ASCII にエンコードされた場合、16 個の ASCI 文字に収まる必要があるというコメントに基づいて、解決策は最初に、暗号化ハッシュ関数を選択することです (SHA-2 ファミリには SHA-256、SHA-384、および SHA-2 が含まれます)。 512) 次に、選択したハッシュ関数の出力を 96 ビット (12 バイト) に切り捨てます。つまり、ハッシュ関数の出力の最初の 12 バイトを保持し、残りのバイトを破棄してから、切り捨てられた出力を base-64 エンコードします。 16 個の ASCII 文字 (128 ビット) に変換し、実質的に 96 ビット強度の暗号化ハッシュを生成します。

base-64 でエンコードされた文字列を 16 文字にサブストリング化すると、それは根本的に異なり、ハッシュ関数の最初の 12 バイトを保持してから base-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-produces-a-hash-size-of-64-bits-in-c)

4

2 に答える 2

1

いいえ、違いはありません。ただし、配列を切り詰める代わりに、配列の最初の 12 バイトの base64 文字列を取得する方が簡単です。

public override void InputBuffer_ProcessInputRow(InputBufferBuffer Row) {

    byte[] hashedData = CreateSha256Hash(Row.HashString);

    Row.HashValue = Convert.ToBase64String(hashedData, 0, 12);

}

Base 64 エンコーディングでは、各文字に単純に 6 ビットが配置されるため、3 バイト (24 ビット) は 4 文字になります。偶数 3 バイト境界でデータを分割している限り、偶数 4 文字境界で文字列を分割するのと同じです。

これらの境界間でデータを分割しようとすると、base64 文字列は次の境界までフィラー データでパディングされるため、結果は同じではありません。

于 2010-12-20T22:11:41.460 に答える
0

切り捨ては、ここに追加するのと同じくらい簡単Take(12)です:

変化する

 byte[] hashedData = CreateSha256Hash(Row.HashString);

に:

 byte[] hashedData = CreateSha256Hash(Row.HashString).Take(12).ToArray();
于 2010-12-20T22:15:35.867 に答える