все, что будет делать хеширование, — это привносить больше случайности
Нет. Вы не можете ввести случайность с детерминированным процессом. Вы можете ввести случайность только с реальным источником случайных данных.
Вы можете использовать хэш как составная часть генератора псевдослучайных чисел, а (криптографически безопасный!) генератор псевдослучайных чисел достаточно хорош для криптографии, где необходима случайность, но еще одним жизненно важным компонентом генератора псевдослучайных чисел является секрет. Этот секрет — состояние генератора случайных чисел, полученное из случайного начального числа: генератор псевдослучайных чисел не создает случайности, он только «умножает» ее в том смысле, что может превратить небольшой объем случайных данных в большой. количество случайных данных.
Хеширование случайной строки только уменьшает ее случайность: теоретически возможно, что две входные строки имеют один и тот же хэш (на самом деле вы не найдете такие строки, и мы не уверены, что они существуют, но есть вероятность, что они существуют). Случайность уменьшается лишь на небольшую величину, так что это не настоящая уязвимость в вашем коде, а ненужное и контрпродуктивное усложнение.
Способ максимизировать случайность состоит в том, чтобы получить результат от генератора случайных чисел. Вызов rng.GetBytes (секретный ключ)
и остановись на этом.
Преобразование ключа в Base64 для передачи, а затем обратно в двоичный код для использования не влияет на криптографию. Это просто кодировка. Расшифруйте его: использование Base64 в качестве ключа может снизить безопасность, поскольку каждый байт может иметь только 1/4 возможных значений. (То, как HMAC использует свой ключ, на самом деле не имеет значения, используете ли вы base64 (случайные_байты (64))
или же случайные_байты (64)
как ключ; но это имело бы значение, например, для ключа AES, который даже не имел бы приемлемой длины.)