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