Создать общий ключ для печати HMAC в .Net - PullRequest
0 голосов
/ 02 декабря 2010

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

В настоящее время я использую метод GetBytes () RNGCryptoServiceProvider для генерации ключа, но возвращаемый байтовый массив содержит непечатаемые символы. Поэтому мне интересно, безопасно ли кодировать base64 результат или это слишком сильно размывает случайность и делает вещи намного менее безопасными? Если это не очень хороший подход, можете ли вы предложить его?

Я понимаю, что, ограничивая ключи печатаемыми символами, я ограничиваю общую ширину пространства ключей (т. Е. Отключая 1 из 8 битов), но я согласен с этим.

Ответы [ 2 ]

3 голосов
/ 02 декабря 2010

BASE64 преобразует последовательность байтов, поэтому она использует только определенные печатаемые символы.

Это преобразование никак не меняет информацию, только то, как она хранится. Это также обратимо: вы можете получить исходную последовательность байтов, расшифровав вывод BASE64.

Таким образом, использование BASE64 не «разрушает случайность» и никоим образом не ограничивает пространство клавиш.

3 голосов
/ 02 декабря 2010

Если вы можете справиться с автоматическим не генерированием ключа, тогда http://www.grc.com/passwords является хорошим источником ОЧЕНЬ материала случайного ключа.

Base64 не уменьшит базовую энтропию байтового массива. Вы можете сгенерировать ключ и использовать его в необработанном виде, но Base64 закодировать его, чтобы перенести туда, где он вам нужен. Затем Base64 декодирует его обратно в необработанную форму, прежде чем использовать его в новом месте. В этой операции нет потери энтропии. Кодирование Base64 уменьшает энтропию до 6 бит на байт вместо 8, но результат кодирования длиннее, поэтому в целом энтропия одинакова.

Другой способ сделать это - получить 24 случайных байта для энтропии стоимостью 192 бита. Кодирование Base64 даст вам 32-символьную строку (256 бит), которая все еще имеет исходную случайность и 192-битную энтропию. Вы можете использовать это как ваш общий ключ напрямую.

...