Рейтинг:1

Генерация и кодирование ключа HMAC

флаг ng

У меня есть этот фрагмент кода .NET, основанный на Образец Microsoft о том, как сгенерировать ключ и подписать с помощью HMACSH256.

Но я немного изменил генерацию ключа, а также решил использовать Base64 для передачи ключа в виде строки:

Генерация ключей:

байт [] секретный ключ = новый байт [64];

используя (RNGCryptoServiceProvider rng = новый RNGCryptoServiceProvider())
{
    rng.GetBytes (секретный ключ);
    используя (SHA512 mySHA256 = SHA512.Create())
    {
          var hashedKey = mySHA256.ComputeHash (секретный ключ);
          var encodedKey = Convert.ToBase64String(hashedKey);
          вернуть закодированный ключ;
    }
}

Итак, помимо генерации случайных байтов, я также решил хэшировать ключ с помощью SHA512. А затем кодировать Base64, чтобы получить окончательное строковое представление, которое будет использоваться только в транспорте, поскольку перед использованием получатель сообщения будет декодировать обратно в дайджест SHA512.

Какие-то проблемы с тем, как я это делаю? Если я не ошибаюсь, все, что хеширование сделает, это внесет больше случайности, поскольку ключ останется длиной 64 байта. Стоит ли оно того?

Кроме того, есть ли проблемы с транспортировкой ключа в виде строки Base64?

Спасибо, и я надеюсь, что кто-то может предложить некоторые отзывы по этому поводу. Удачи!

Рейтинг:1
флаг cn

все, что будет делать хеширование, — это привносить больше случайности

Нет. Вы не можете ввести случайность с детерминированным процессом. Вы можете ввести случайность только с реальным источником случайных данных.

Вы можете использовать хэш как составная часть генератора псевдослучайных чисел, а (криптографически безопасный!) генератор псевдослучайных чисел достаточно хорош для криптографии, где необходима случайность, но еще одним жизненно важным компонентом генератора псевдослучайных чисел является секрет. Этот секрет — состояние генератора случайных чисел, полученное из случайного начального числа: генератор псевдослучайных чисел не создает случайности, он только «умножает» ее в том смысле, что может превратить небольшой объем случайных данных в большой. количество случайных данных.

Хеширование случайной строки только уменьшает ее случайность: теоретически возможно, что две входные строки имеют один и тот же хэш (на самом деле вы не найдете такие строки, и мы не уверены, что они существуют, но есть вероятность, что они существуют). Случайность уменьшается лишь на небольшую величину, так что это не настоящая уязвимость в вашем коде, а ненужное и контрпродуктивное усложнение.

Способ максимизировать случайность состоит в том, чтобы получить результат от генератора случайных чисел. Вызов rng.GetBytes (секретный ключ) и остановись на этом.

Преобразование ключа в Base64 для передачи, а затем обратно в двоичный код для использования не влияет на криптографию. Это просто кодировка. Расшифруйте его: использование Base64 в качестве ключа может снизить безопасность, поскольку каждый байт может иметь только 1/4 возможных значений. (То, как HMAC использует свой ключ, на самом деле не имеет значения, используете ли вы base64 (случайные_байты (64)) или же случайные_байты (64) как ключ; но это имело бы значение, например, для ключа AES, который даже не имел бы приемлемой длины.)

danutz_plusplus avatar
флаг ng
Спасибо за просветительский пост. Да, теперь, когда вы упомянули об этом, очевидно, что, поскольку дайджест находится в уменьшенном пространстве значений, он теоретически будет уменьшен. Теперь, когда я думаю об этом, я получил идею из другой системы, где я видел, что они использовали случайно сгенерированные пароли (не для использования реальными людьми) и они хешировали значения перед их сохранением. Но теперь, когда я думаю об этом, я думаю, что это было сделано больше для того, чтобы не допустить обратного проектирования их значений. Как вы обычно делаете с паролями.
danutz_plusplus avatar
флаг ng
Насчет кодирования, да, я так думал, что мне нужно его декодировать, прежде чем использовать. К счастью, API достаточно умен, чтобы даже не принимать строку. Он принимает только byte[].
danutz_plusplus avatar
флаг ng
Кроме того, пожалуйста, игнорируйте повторение «теперь, когда я думаю об этом». Кажется, я не совсем обдумал ответ и редактировал его до тех пор, пока он не потерял почти весь смысл. :D И теперь я не могу это редактировать 5 минут :D

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.