Go by Example - IT: Hash SHA1

La funzione SHA-1 viene frequentemente utilizzata per calcolare il digest (l’impronta) dei file binari o di testo. Ad esempio il sistema di versionamento git utilizza gli SHA-1 in modo intensivo per identificare i file e le cartelle versionate. Ecco come calcolare gli hash SHA-1 in Go.

package main

Si possono trovare implementazioni di svariati algoritmi crittografici dentro il pacchetto crypto/*.

import "crypto/sha1"
import "fmt"
func main() {
    s := "sha1 this string"

Il pattern per creare un nuovo hash è sha1.New(), sha1.Write(bytes), ed infine sha1.Sum([]byte{}). Iniziamo creando un nuovo hash.

    h := sha1.New()

La funzione Write lavora con i bytes. Se si deve calcolare l’hash di una stringa s è possibile utilizzare []byte(s) per ottenerne i bytes.

    h.Write([]byte(s))

Con la funzione Sum è possibile ottenere il valore dell’hash. L’argomento può essere utilizzato per accodare il valore calcolato ad uno slice di byte esistente, non è generalmente necessario.

    bs := h.Sum(nil)

Gli SHA-1 sono generalmente stampati in formato esadecimale (ad esempio nei commit di git). Utilizza ‘%x’ per stampare il valore in esadecimale.

    fmt.Println(s)
    fmt.Printf("%x\n", bs)
}

Eseguendo il programma si nota che viene calcolato l’hash della funzione e stampato in esadecimale a schermo

$ go run sha1-hashes.go
sha1 this string
cf23df2207d99a74fbe169e3eba035e633b65d94

È possibile calcolare altre funzioni hash in un modo molto simile. Ad esempio per calcolare l’MD5 è sufficiente importare crypto/md5 ed usare md5.New().

Nota che se necessiti di funzioni hash che siano sicure dal punto di vista crittografico, ti consigliamo di approfondire il tema dello hash strength!

Prossimo esempio: Codifica Base64.