2016-09-20 4 views
1

У меня возникают проблемы с сравнением хэшей SHA256, сгенерированными разными языками/функциями.Исправлена ​​реализация SHA256 с символами UTF-8

Например, SHA256("í") либо возвращается:

f3df1f9c358ae8eceb8fce7c00614288d113ad55315f4ebb909774a7daadfc84 

-или-

127035a8ff26256ea0541b5add6dcc3ecdaeea603e606f84e0fd63492fbab2c5 

Какой из выше хэш является правильным для строки одного символа, и то, что правильный способ обработки UTF -8 строк?

+1

Нет такой вещи, как символ «UTF-8». Существуют символы Unicode, и они могут быть * закодированы * как UTF-8, если хотите. Вы не сказали нам, на каком языке вас интересует вообще, но в основном процесс должен состоять в том, чтобы кодировать строку в двоичные данные с использованием выбранной вами кодировки (например, UTF-8), взять хэш SHA-256 этого и затем преобразовать этот хэш обратно в строку с использованием hex или base64. –

ответ

3

Какой из выше хэша является правильным для строки одного символа

Там нет «правильного» ответа. То, что хэшируется, - это байт, а не «символ». Какие байты хэшируются в точности, зависит от кодировки строки.

"í" в Windows-1252 байтам ED, который хэшей как:

f3df1f9c358ae8eceb8fce7c00614288d113ad55315f4ebb909774a7daadfc84 

"í" в UTF-8 байт C3 AD, который хэшей как:

127035a8ff26256ea0541b5add6dcc3ecdaeea603e606f84e0fd63492fbab2c5 

"í" в UTF-16LE является байты ED 00, хеши как:

430e2ca27910b5ee6e0ec56a12b81325c763376cb8e25a60362dce9444424f95 

Как именно это работает на разных языках программирования, зависит от языков и кодировок, которые они используют для строк.

Смежные вопросы