O Resumo da Mensagem (hash) é byte [] in byte [] out
Um resumo da mensagem é definido como uma função que pega uma matriz de bytes brutos e retorna uma matriz de bytes brutos (aka byte[]
). Por exemplo, o SHA-1 (algoritmo de hash seguro 1) tem um tamanho de resumo de 160 bits ou 20 bytes. Matrizes de bytes brutos geralmente não podem ser interpretadas como codificações de caracteres como UTF-8 , porque nem todos os bytes em cada ordem são uma codificação legal. Então, convertendo-os em um String
com:
new String(md.digest(subject), StandardCharsets.UTF_8)
pode criar algumas seqüências ilegais ou possui indicadores de código para mapeamentos Unicode indefinidos :
[�a�ɹ??�%l�3~��.
Codificação de binário para texto
Para essa codificação de binário para texto é usada. Com os hashes, o mais usado é a codificação HEX ou Base16 . Basicamente, um byte pode ter o valor de 0
a 255
(ou -128
a 127
assinatura), que é equivalente à representação de HEX 0x00
- 0xFF
. Portanto, hex dobrará o comprimento necessário da saída, o que significa que uma saída de 20 bytes criará uma cadeia hexadecimal de 40 caracteres, por exemplo:
2fd4e1c67a2d28fced849ee1bb76e7391b93eb12
Observe que não é necessário usar a codificação hexadecimal. Você também pode usar algo como base64 . O hex é frequentemente preferido porque é mais fácil de ser lido por humanos e tem um comprimento de saída definido sem a necessidade de preenchimento.
Você pode converter uma matriz de bytes em hexadecimal apenas com a funcionalidade JDK:
new BigInteger(1, token).toString(16)
Observe, no entanto, que BigInteger
interpretará a matriz de bytes fornecida como número e não como uma sequência de bytes. Isso significa que os zeros à esquerda não serão gerados e a sequência resultante poderá ser menor que 40 caracteres.
Usando bibliotecas para codificar para HEX
Agora você pode copiar e colar um método não testado de bytes para hexa do Stack Overflow ou usar dependências massivas como o Guava .
Para ter uma solução básica para a maioria dos problemas relacionados a bytes, implementei um utilitário para lidar com estes casos: bytes-java (Github)
Para converter sua matriz de bytes de resumo da mensagem, você pode simplesmente fazer
String hex = Bytes.wrap(md.digest(subject)).encodeHex();
ou você pode simplesmente usar o recurso de hash embutido
String hex = Bytes.from(subject).hashSha1().encodeHex();
SHA1
sem o hífen, não sei se isso fará diferença.