Ce face crypto/sha256.Sum256
Un hash criptografic este o „amprentă” de lungime fixă a unor date: aceleași date dau mereu același rezultat, o singură literă schimbată dă un rezultat complet diferit, iar din amprentă nu se pot reconstrui datele. sha256.Sum256(date) returnează amprenta SHA-256 ca tablou de 32 de octeți; o afișezi cu %x sau hex.EncodeToString(suma[:]).
Folosiri: verificarea integrității unui fișier descărcat (comparat cu suma publicată), detectarea duplicatelor, chei de cache, identificatori de conținut. Pentru date mari sau citite în bucăți (fișiere), folosește sha256.New().
Nu folosi SHA-256 simplu pentru parole: este prea rapid și permite încercări de miliarde de ori pe secundă. Pentru parole se folosesc algoritmi lenți, cu „sare”, ca bcrypt, scrypt sau Argon2 (pachetele din golang.org/x/crypto).
Parametri
| Parametru | Descriere |
|---|---|
data |
Datele de rezumat. |
Ce returnează
Un tablou [32]byte.
Exemple
Exemplul 1: O literă schimbă tot
package main
import (
"crypto/sha256"
"fmt"
)
func main() {
for _, text := range []string{"Transfer 100 lei către Ana", "Transfer 900 lei către Ana", ""} {
fmt.Printf("%x %q\n", sha256.Sum256([]byte(text)), text)
}
suma := sha256.Sum256([]byte("abc"))
fmt.Println("Lungime:", len(suma), "octeți =", len(fmt.Sprintf("%x", suma)), "cifre hex")
}
Rezultat
aec993703c604f855cadc6b1c192410ac34d20c40ccf316836d28c560dff9ce4 "Transfer 100 lei către Ana"
c5d5818ce31b3e7cac5028a7ee3ab994df91656a4b411aa2abbf42e31d4be00d "Transfer 900 lei către Ana"
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 ""
Lungime: 32 octeți = 64 cifre hex
Exemplul 2: Fișiere duplicate
package main
import (
"crypto/sha256"
"fmt"
"os"
)
func main() {
os.WriteFile("poza1.jpg", []byte("conținut imagine A"), 0o644)
os.WriteFile("poza2.jpg", []byte("conținut imagine B"), 0o644)
os.WriteFile("copie-poza1.jpg", []byte("conținut imagine A"), 0o644)
vazute := map[[32]byte]string{}
for _, nume := range []string{"poza1.jpg", "poza2.jpg", "copie-poza1.jpg"} {
date, err := os.ReadFile(nume)
if err != nil {
fmt.Println(err)
continue
}
h := sha256.Sum256(date)
if original, ok := vazute[h]; ok {
fmt.Printf("%s este duplicat al lui %s\n", nume, original)
continue
}
vazute[h] = nume
fmt.Printf("%s: %x...\n", nume, h[:6])
}
}
Rezultat
poza1.jpg: a93fc37872fb...
poza2.jpg: 0af382c673a6...
copie-poza1.jpg este duplicat al lui poza1.jpg
Greșeli frecvente
- Salvezi parolele utilizatorilor ca
sha256.Sum256(parola). Parolele comune se găsesc imediat în tabele precalculate; folosește bcrypt sau Argon2. - Compari un hash calculat cu unul primit folosind
==pe texte într-un context de securitate (tokenuri, semnături): diferența de timp poate trăda informații. Foloseștesubtle.ConstantTimeComparesauhmac.Equal.
Comenzi înrudite
crypto/sha256.New: Creează un calculator SHA-256 în care scrii datele pe bucăți (ex. cu io.Copy dintr-un fișier), apoi citești suma cu Sum(nil).crypto/md5.Sum: Calculează suma MD5 (16 octeți, 32 cifre hex); bună doar pentru sume de control, nu pentru securitate.encoding/hex.EncodeToString: Scrie octeții în hexazecimal (două cifre 0-9a-f pe octet) și înapoi; forma obișnuită pentru hash-uri și chei.crypto/rand.Read: Umple un slice cu octeți aleatorii siguri criptografic, luați de la sistemul de operare (chei, tokenuri, sare).