Дайджест сообщения (хеш) - это байт [] в байте [] out
Дайджест сообщения определяется как функция, которая принимает необработанный байтовый массив и возвращает необработанный байтовый массив (он же byte[]
).Например, SHA-1 (алгоритм безопасного хеширования 1) имеет размер дайджеста 160 бит или 20 байт.Необработанные байтовые массивы обычно не могут интерпретироваться как кодировки символов , такие как UTF-8 , поскольку не каждый байт в каждом порядке является допустимой кодировкой.Таким образом, преобразование их в String
с помощью:
new String(md.digest(subject), StandardCharsets.UTF_8)
может создать некоторые недопустимые последовательности или иметь указатели на неопределенные Unicode отображения:
[�a�ɹ??�%l�3~��.
Binary-текстовое кодирование
Для этого используется двоичное-текстовое кодирование.Для хэшей чаще всего используется кодировка HEX или Base16 .Как правило, байт может иметь значение от 0
до 255
(или от -128
до 127
со знаком), что эквивалентно HEX-представлению 0x00
- 0xFF
.Таким образом, шестнадцатеричный код удвоит требуемую длину выходных данных, что означает, что 20-байтовый выход создаст шестнадцатеричную строку длиной 40 символов, например:
2fd4e1c67a2d28fced849ee1bb76e7391b93eb12
Обратите внимание, что использовать шестнадцатеричное кодирование не требуется.Вы также можете использовать что-то вроде base64 .Шестнадцатеричный формат часто предпочитается, потому что он легче читается людьми и имеет определенную выходную длину без необходимости дополнения.
Вы можете преобразовать байтовый массив в шестнадцатеричный с помощью только функций JDK:
new BigInteger(1, token).toString(16)
Обратите внимание, что BigInteger
будет интерпретировать данный байтовый массив как число , а не как байтовую строку.Это означает, что начальные нули не будут выводиться, а результирующая строка может быть короче 40 символов.
Использование библиотек для кодирования в HEX
Теперь вы можете скопировать и вставить непроверенный байт-метод to-hex из Stack Overflow или использование массивных зависимостей, таких как Guava .
Чтобы получить решение для большинства проблем, связанных с байтами, я реализовал утилиту для обработки этих случаев: bytes-java (Github)
Чтобы преобразовать массив байтов дайджеста сообщения, вы можете просто сделать
String hex = Bytes.wrap(md.digest(subject)).encodeHex();
или использовать встроенную функцию хеширования
String hex = Bytes.from(subject).hashSha1().encodeHex();