SHA-256 e SHA3-256 Hashing em Java

Overview

O SHA (Algoritmo de Hash Seguro) é uma das populares funções criptográficas de hash. Um hash criptográfico pode ser usado para fazer uma assinatura para um texto ou um ficheiro de dados. Neste tutorial, vejamos como podemos executar operações de hash SHA-256 e SHA3-256 usando várias bibliotecas Java.

O algoritmo SHA-256 gera um hash quase único, de tamanho fixo de 256 bits (32 byte). Esta é uma função unidireccional, pelo que o resultado não pode ser desencriptado de volta ao valor original.

Currentemente, o hash SHA-2 é amplamente utilizado, uma vez que está a ser considerado como o algoritmo de hash mais seguro na arena criptográfica.

SHA-3 é o mais recente padrão de hash seguro depois do SHA-2. Em comparação com o SHA-2, o SHA-3 proporciona uma abordagem diferente para gerar um hash unidireccional único, e pode ser muito mais rápido em algumas implementações de hardware. Semelhante ao SHA-256, o SHA3-256 é o algoritmo de comprimento fixo de 256 bits no SHA-3.

NIST lançou o SHA-3 em 2015, por isso não existem por enquanto tantas bibliotecas de SHA-3 como o SHA-2. Só no JDK 9 é que os algoritmos SHA-3 estavam disponíveis nos fornecedores por defeito incorporados.

Agora, vamos começar com SHA-256.

Outra leitura:

Hashing sensível à localização em Java usando Java-LSH

Um guia rápido e prático para aplicar o algoritmo de Hashing sensível à localização em Java usando a biblioteca java-lsh.
Leia mais →

MD5 Hashing em Java

Uma escrita rápida mostra-lhe como lidar com o hashing MD5 em Java.
Leia mais →

Um guia do HashSet em Java

Uma introdução rápida mas abrangente ao HashSet em Java.
Leia mais →

MessageDigest Class in Java

Java fornece a classe inbuilt MessageDigest para o hashing SHA-256:

MessageDigest digest = MessageDigest.getInstance("SHA-256");byte encodedhash = digest.digest( originalString.getBytes(StandardCharsets.UTF_8));

Contudo, aqui temos de usar um conversor byte personalizado para hexadecimal:

private static String bytesToHex(byte hash) { StringBuilder hexString = new StringBuilder(2 * hash.length); for (int i = 0; i < hash.length; i++) { String hex = Integer.toHexString(0xff & hash); if(hex.length() == 1) { hexString.append('0'); } hexString.append(hex); } return hexString.toString();}

Precisamos de estar conscientes de que a MessageDigest não é segura para os fios. Consequentemente, devemos utilizar uma nova instância para cada thread.

Biblioteca Goiabada

A biblioteca Goiabada do Google também fornece uma classe de utilidade para hashing.

P>Primeiro, vamos definir a dependência:

<dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>20.0</version></dependency>

Agora, eis como podemos usar a Goiaba para hash a String:

String sha256hex = Hashing.sha256() .hashString(originalString, StandardCharsets.UTF_8) .toString();

Apache Commons Codecs

Simplesmente, também podemos usar os Apache Commons Codecs:

<dependency> <groupId>commons-codec</groupId> <artifactId>commons-codec</artifactId> <version>1.11</version></dependency>

Aqui está a classe de utilidade – chamada DigestUtils – que suporta o hashing SHA-256:

String sha256hex = DigestUtils.sha256Hex(originalString);

Biblioteca do Castelo Saltitante

5.1. Maven Dependency

<dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcprov-jdk15on</artifactId> <version>1.60</version></dependency>

5.2. Hashing Using the Bouncy Castle Library

O Bouncy Castle API fornece uma classe de utilidade para conversão de dados hexadecimais em bytes e vice-versa.

No entanto, é necessário preencher um resumo usando o Java API integrado primeiro:

MessageDigest digest = MessageDigest.getInstance("SHA-256");byte hash = digest.digest( originalString.getBytes(StandardCharsets.UTF_8));String sha256hex = new String(Hex.encode(hash));

SHA3-256

Agora vamos continuar com SHA3-256. SHA3-256 hashing em Java não é nada muito diferente de SHA-256.

6.1. Classe MessageDigest em Java

A partir de JDK 9, podemos simplesmente usar o algoritmo SHA3-256 integrado:

final MessageDigest digest = MessageDigest.getInstance("SHA3-256");final byte hashbytes = digest.digest( originalString.getBytes(StandardCharsets.UTF_8));String sha3Hex = bytesToHex(hashbytes);

6.2. Apache Commons Codecs

Apache Commons Codecs fornece um conveniente envoltório DigestUtils para a classe MessageDigest. Esta biblioteca começou a suportar SHA3-256 desde a versão 1.11, e requer também JDK 9+:

String sha3Hex = new DigestUtils("SHA3-256").digestAsHex(originalString);

6.3. Keccak-256

Keccak-256 é outro algoritmo de hashing popular do SHA3-256. Actualmente, serve como uma alternativa ao SHA3-256 padrão. O Keccak-256 fornece o mesmo nível de segurança que o SHA3-256 padrão, e difere do SHA3-256 apenas na regra do estofamento. Tem sido utilizado em vários projectos de cadeias de blocos, tais como Monero.

Again, precisamos de importar a Biblioteca do Castelo Bouncy para usar o hashing Keccak-256:

Security.addProvider(new BouncyCastleProvider());final MessageDigest digest = MessageDigest.getInstance("Keccak-256");final byte encodedhash = digest.digest( originalString.getBytes(StandardCharsets.UTF_8));String sha3Hex = bytesToHex(encodedhash);

Podemos também fazer uso do Bouncy Castle API para fazer o hashing:

Keccak.Digest256 digest256 = new Keccak.Digest256();byte hashbytes = digest256.digest( originalString.getBytes(StandardCharsets.UTF_8));String sha3Hex = new String(Hex.encode(hashbytes));

Conclusion

Neste artigo rápido, demos uma vista de olhos a algumas formas de implementar o hashing SHA-256 e SHA3-256 em Java, utilizando bibliotecas integradas e de terceiros.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *