Усечение байтового массива по сравнению с подстрокой закодированной строки, выходящей из SHA-256 - PullRequest
0 голосов
/ 21 декабря 2010

Я не знаком с алгоритмами хеширования и рисками, связанными с их использованием, и поэтому у меня есть вопрос о ответе ниже, который я получил на предыдущий вопрос.,,

Исходя из комментария о том, что значение хеш-функции при кодировании в ASCII должно соответствовать 16 символам ASCI, решение в первую очередь состоит в выборе некоторой криптографической хеш-функции (семейство SHA-2 включает SHA-256, SHA-384 и SHA-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);


}

[Исходное сообщение] (/3013919/suschestvuet-li-algoritm-heshirovaniya-kotoryi-sozdaet-razmer-hesha-v-64-bita-v-c)

Ответы [ 2 ]

1 голос
/ 21 декабря 2010

Нет, разницы нет.Однако проще просто получить строку base64 из первых 12 байтов массива вместо усечения массива:

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 будетдополнить данными заполнителя до следующей границы, чтобы результат не был таким же.

0 голосов
/ 21 декабря 2010

Усечение так же просто, как добавление Take(12) здесь:

Изменение

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

Кому:

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