crypto/md5.Sum în Go

Calculează suma MD5 (16 octeți, 32 cifre hex); bună doar pentru sume de control, nu pentru securitate.

Sintaxă
import "crypto/md5"

func Sum(data []byte) [16]byte

Ce face crypto/md5.Sum

md5.Sum(date) returnează amprenta MD5 a datelor, un tablou de 16 octeți, afișat de obicei cu %x (32 de caractere). MD5 este încă folosit pentru compatibilitate: sume de control pentru fișiere, antetul ETag, chei de cache, unele API-uri vechi și Gravatar.

MD5 este spart criptografic: se pot construi ușor două fișiere diferite cu aceeași sumă. Nu îl folosi pentru parole, semnături sau verificarea fișierelor descărcate din surse în care nu ai încredere; folosește SHA-256. Pentru date citite în flux există md5.New(), la fel ca la sha256.New.

Parametri

Parametru Descriere
data Datele de rezumat.

Ce returnează

Un tablou [16]byte.

Exemple

Exemplul 1: Sume MD5

package main

import (
	"crypto/md5"
	"fmt"
)

func main() {
	for _, t := range []string{"", "dexblog", "Dexblog"} {
		fmt.Printf("%x  %q\n", md5.Sum([]byte(t)), t)
	}
}

Rezultat

d41d8cd98f00b204e9800998ecf8427e  ""
eef1771a1990919bae19d3cba1128be6  "dexblog"
06f4985dcc100256177483c7688a1519  "Dexblog"

Exemplul 2: ETag pentru un răspuns HTTP

Browserul trimite înapoi ETag-ul în If-None-Match; dacă pagina nu s-a schimbat, răspundem cu 304, fără corp.

package main

import (
	"crypto/md5"
	"fmt"
	"net/http"
	"net/http/httptest"
)

var pagina = []byte("<h1>Prețuri actualizate la 19.10.2026</h1>")

func handler(w http.ResponseWriter, r *http.Request) {
	etag := fmt.Sprintf(`"%x"`, md5.Sum(pagina))
	w.Header().Set("ETag", etag)
	if r.Header.Get("If-None-Match") == etag {
		w.WriteHeader(http.StatusNotModified)
		return
	}
	w.Write(pagina)
}

func main() {
	rec := httptest.NewRecorder()
	handler(rec, httptest.NewRequest("GET", "/preturi", nil))
	etag := rec.Header().Get("ETag")
	fmt.Println("Prima cerere:", rec.Code, "ETag:", etag, "corp:", rec.Body.Len(), "octeți")

	req := httptest.NewRequest("GET", "/preturi", nil)
	req.Header.Set("If-None-Match", etag)
	rec = httptest.NewRecorder()
	handler(rec, req)
	fmt.Println("A doua cerere:", rec.Code, "corp:", rec.Body.Len(), "octeți")
}

Rezultat

Prima cerere: 200 ETag: "e476e760e06231d11a6dcff687e3ea6f" corp: 43 octeți
A doua cerere: 304 corp: 0 octeți

Greșeli frecvente

  • Folosești MD5 pentru parole sau tokenuri: este rapid și spart. Folosește bcrypt/Argon2 pentru parole și crypto/rand pentru tokenuri.

Comenzi înrudite

  • crypto/sha256.Sum256: Calculează amprenta SHA-256 a unor date: 32 de octeți (64 de cifre hex) care se schimbă complet la orice modificare.
  • 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).
  • 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.