Digest e calcolo Hash.

DocumentazioneTecniche di Crittografia

Un digest crittografico (o funzione di hash) è un algoritmo che prende un messaggio di lunghezza qualsiasi e lo trasforma in una stringa di lunghezza fissa chiamata impronta (hash). Questa impronta presenta delle caratteristiche definite:

  • Deterministica: lo stesso input produce sempre lo stesso output.
  • Irreversibile: è impossibile ricostruire l'input originale a partire dall'hash.
  • Sensibile al minimo cambiamento: anche un solo bit modificato genera un hash completamente diverso.

Cryptea implementa e utilizza SHA-512, una delle funzioni di hash più sicure e diffuse al mondo, appartenente alla famiglia SHA-2 e raccomandata dagli standard NIST.

SHA-512 produce un hash di 512 bit (64 byte). Offre un ottimo compromesso tra sicurezza e prestazioni ed è resistente agli attacchi di collisione noti ad oggi.

Implementazione Java

Utilizziamo SHA-512 per:

  • Calcolare l'hash per firmarla con chiave privata RSA (firma digitale).
  • Generare la firma server-side (HmacSHA512).
  • Verificare l'integrità dei messaggi cifrati in modalità CBC.
  • Calcolare l'hash dei certificati emessi e la firma con chiave privata RSA della Certification Authority.
java
package app.cryptea.cert;

import java.math.BigInteger;
import java.security.MessageDigest;

public class SHADigest {
    public static String getStringDigest(byte[] bytes) throws Exception {
        MessageDigest digest = MessageDigest.getInstance("SHA-512");
        byte[] hash = digest.digest(bytes);
        String hashtext = new BigInteger(1, hash).toString(16).toUpperCase();
        return hashtext;
    }

    public static byte[] getByteDigest(byte[] bytes) throws Exception {
        MessageDigest digest = MessageDigest.getInstance("SHA-512");
        byte[] hash = digest.digest(bytes);
        return hash;
    }
}