El resumen del mensaje (hash) es byte [] in byte [] out
Un resumen de mensaje se define como una función que toma un conjunto de bytes sin formato y devuelve un conjunto de bytes sin formato (también conocido como byte[]
). Por ejemplo, SHA-1 (Algoritmo de hash seguro 1) tiene un tamaño de resumen de 160 bits o 20 bytes. Las matrices de bytes sin procesar generalmente no se pueden interpretar como codificaciones de caracteres como UTF-8 , porque no todos los bytes en cada orden son legales. Entonces convertirlos a a String
con:
new String(md.digest(subject), StandardCharsets.UTF_8)
puede crear algunas secuencias ilegales o tiene punteros de código para asignaciones Unicode indefinidas :
[�a�ɹ??�%l�3~��.
Codificación de binario a texto
Para eso se utiliza la codificación de binario a texto . Con los hashes, el que más se usa es la codificación HEX o Base16 . Básicamente, un byte puede tener el valor de 0
a 255
(o -128
con 127
signo) que es equivalente a la representación HEX de 0x00
- 0xFF
. Por lo tanto, el hexadecimal duplicará la longitud requerida de la salida, eso significa que una salida de 20 bytes creará una cadena hexadecimal de 40 caracteres de longitud, por ejemplo:
2fd4e1c67a2d28fced849ee1bb76e7391b93eb12
Tenga en cuenta que no es necesario utilizar la codificación hexadecimal. También podrías usar algo como base64 . A menudo se prefiere el maleficio porque es más fácil de leer por los humanos y tiene una longitud de salida definida sin la necesidad de relleno.
Puede convertir una matriz de bytes a hexadecimal con la funcionalidad JDK sola:
new BigInteger(1, token).toString(16)
Sin embargo, BigInteger
tenga en cuenta que interpretará la matriz de bytes dada como un número y no como una cadena de bytes. Eso significa que no se generarán ceros a la izquierda y la cadena resultante puede ser más corta que 40 caracteres.
Uso de bibliotecas para codificar en HEX
Ahora podría copiar y pegar un método de byte a hex no probado desde Stack Overflow o usar dependencias masivas como Guava .
Para tener una solución para la mayoría de los problemas relacionados con los bytes, implementé una utilidad para manejar estos casos: bytes-java (Github)
Para convertir su conjunto de bytes de resumen de mensaje, simplemente puede hacer
String hex = Bytes.wrap(md.digest(subject)).encodeHex();
o simplemente puedes usar la función integrada de hash
String hex = Bytes.from(subject).hashSha1().encodeHex();
SHA1
guión, no sé si eso hará la diferencia.