SHA1 Обычный текст?C # .NET - PullRequest
6 голосов
/ 17 марта 2011

Я использую C # и вычисляю SHA1 для строки. Мой вопрос заключается в том, что это всегда будет производить простой текст 0-1 и A-Z? Или он также будет производить специальные символы? Я имею в виду, функция ComputeHash будет всегда возвращать простой текст?

SHA1CryptoServiceProvider sha1 = new SHA1CryptoServiceProvider();
string receivedValue = BitConverter.ToString(sha1.ComputeHash(to_be_hash)).Replace("-", "");

Не уверен, но я думаю, что он должен генерировать специальный символ, только если он преобразован в Base 64.

Ответы [ 2 ]

25 голосов
/ 17 марта 2011

API-интерфейс хэширования возвращает byte[], содержащий произвольную последовательность из 20 байтов.

Вам необходимо преобразовать его в строку самостоятельно.Использование Hex или Base64 в качестве кодировок является популярным выбором.

BitConverter.ToString() преобразует строку в шестнадцатеричный код с байтами, разделенными -.Так как вы затем удаляете - s, вы получите шестнадцатеричную строку из 40 символов (0 - 9, A - F), которая является подмножеством буквенно-цифровых символов.

Таким образом, ваш код всегда будет возвращать буквенно-цифровую строку, даже если SHA-1 нет.

SHA1CryptoServiceProvider sha1 = new SHA1CryptoServiceProvider();
byte[] hash = sha1.ComputeHash(to_be_hash)
string delimitedHexHash = BitConverter.ToString(hash);
string hexHash = delimitedHexHash.Replace("-", "");
8 голосов
/ 17 марта 2011

Это шестнадцатеричная строка, поэтому только 0-9 и A-F.

На самом деле это просто байтовый массив, но вы используете метод string BitConverter.ToString(byte[]), чтобы превратить его в шестнадцатеричную строку в парах из двух, разделенных - (тире).

Шестнадцатеричный содержит только: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F. 16 опций, пара из двух из которых будет представлять один байт (16 * 16 = 2 ^ 8 = 256, это один байт).

...