crypto/sha256.Sum256 în Go

Calculează amprenta SHA-256 a unor date: 32 de octeți (64 de cifre hex) care se schimbă complet la orice modificare.

Sintaxă
import "crypto/sha256"

func Sum256(data []byte) [32]byte

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ște subtle.ConstantTimeCompare sau hmac.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).