crypto/*, compress & math/rand/v2
Hashing, primitivas de cifrado, compresión y aleatoriedad se encuentran en paquetes enfocados de la biblioteca estándar.
Busca en todas las páginas de la documentación
Hashing, primitivas de cifrado, compresión y aleatoriedad se encuentran en paquetes enfocados de la biblioteca estándar.
La aleatoriedad sensible a la seguridad proviene de crypto/rand; la simulación y el barajado usan math/rand/v2.
Los paquetes de compresión envuelven io.Reader y io.Writer para que los pipelines de HTTP y archivos permanezcan en streaming.
Usa crypto/sha256 y similares para sumas de verificación y direccionamiento de contenido.
Usa crypto/tls y crypto/x509 para listeners HTTPS y TLS mutuo.
Usa compress/gzip para reducir payloads sin cargar archivos completos en memoria.
Trata math/rand/v2 como la API moderna para aleatoriedad no criptográfica con valores Rand explícitos.
Tarjeta de referencia rápida - lista para copiar y pegar.
import (
"crypto/rand"
"crypto/sha256"
"encoding/hex"
"io"
)
h := sha256.New()
_, _ = io.Copy(h, reader)
sum := hex.EncodeToString(h.Sum(nil))
token := make([]byte, 32)
_, _ = rand.Read(token)Cuándo usar esto:
rand/v2 sembrado.package main
import (
"bytes"
"compress/gzip"
"crypto/rand"
"crypto/sha256"
"encoding/hex"
"fmt"
"io"
"math/rand/v2"
)
func hashAndCompress(in []byte) (digest string, compressed []byte, err error) {
h := sha256.New()
if _, err = h.Write(in); err != nil {
return "", nil, err
}
digest = hex.EncodeToString(h.Sum(nil))
var buf bytes.Buffer
zw := gzip.NewWriter(&buf)
if _, err = zw.Write(in); err != nil {
zw.Close()
return "", nil, err
}
if err = zw.Close(); err != nil {
return "", nil, err
}
return digest, buf.Bytes(), nil
}
func secureToken(n int) (string, error) {
b := make([]byte, n)
if _, err := rand.Read(b); err != nil {
return "", err
}
return hex.EncodeToString(b), nil
}
func shuffleDemo(seed uint64, items []string) []string {
r := rand.New(rand.NewPCG(seed, seed^0x9e3779b97f4a7c15))
out := append([]string(nil), items...)
r.Shuffle(len(out), func(i, j int) { out[i], out[j] = out[j], out[i] })
return out
}
func main() {
payload := []byte("hello stdlib")
digest, gz, err := hashAndCompress(payload)
if err != nil {
panic(err)
}
fmt.Println("sha256:", digest)
fmt.Println("gzip bytes:", len(gz))
tok, err := secureToken(16)
if err != nil {
panic(err)
}
fmt.Println("token:", tok)
fmt.Println(shuffleDemo(42, []string{"a", "b", "c", "d"}))
}Qué demuestra esto:
sha256.New como io.Writer para hashing incremental.gzip.NewWriter con Close obligatorio para vaciar los tráilers.crypto/rand.Read para tokens impredecibles.math/rand/v2 con fuente PCG explícita y Shuffle.hash.Hash (Write, Sum, Reset) para entrada en streaming.crypto/rand lee del CSPRNG del sistema operativo (getrandom, /dev/urandom, etc.).gzip.Writer comprime en un io.Writer subyacente; los lectores descomprimen simétricamente.math/rand/v2 elimina el estado global mutable del diseño del paquete math/rand heredado.| Paquete | Rol | ¿Seguro para Criptografía? |
|---|---|---|
crypto/sha256 | Resumen | N/A (hash, no secreto) |
crypto/rand | Bytes aleatorios | Sí |
crypto/tls | Configuración y handshake TLS | Sí (cuando está configurado correctamente) |
compress/gzip | DEFLATE + formato gzip | N/A |
math/rand/v2 | Pseudoaleatorio rápido | No |
// Compara resúmenes en tiempo constante al proteger secretos:
import "crypto/subtle"
subtle.ConstantTimeCompare(a, b) == 1
// Versión mínima de TLS para servidores:
cfg := &tls.Config{MinVersion: tls.VersionTLS12}crypto/rand.Read para secretos; rand/v2 solo para usos no relacionados con la seguridad.Close y verificar el error.Reset antes de hashear un nuevo payload en la misma instancia.crypto/aes o TLS para confidencialidad.*rand.Rand de rand/v2 con una semilla explícita en las pruebas.| Alternativa | Usar Cuando | No Usar Cuando |
|---|---|---|
Módulos blake2 / bcrypt | Necesidades de hashing de contraseñas | Sumas de verificación de contenido simples (sha256 es suficiente) |
zstd de terceros | Mejor ratio de compresión | Se requiere despliegue solo con la biblioteca estándar |
Enlaces a openssl | Requisitos de cifrado heredados | Go tls cubre despliegues modernos |
| Módulos de seguridad de hardware | Material de clave nunca en RAM | Desarrollo local y servicios pequeños |
crypto/rand para claves, tokens y cualquier cosa que un atacante adivinando rompería.
math/rand/v2 para simulaciones, jitter de pruebas de carga y barajados de prueba deterministas con semillas explícitas.
Valores Rand explícitos reemplazan el estado global oculto.
Algoritmos como PCG y ChaCha8 están disponibles con APIs de siembra más claras.
El math/rand heredado permanece para compatibilidad.
Abre el archivo, io.Copy en sha256.New(), luego Sum(nil).
El mismo patrón funciona para los hashers MD5 y SHA-512.
No.
compress/gzip es un envoltorio gzip de un solo stream.
Los archivos ZIP necesitan archive/zip, un formato diferente.
Pasa tls.Config con Certificates o GetCertificate a http.Server o tls.Listen.
Carga archivos PEM con tls.LoadX509KeyPair o usa automatización ACME externamente.
Sí.
Envuelve ResponseWriter con gzip.NewWriter, establece Content-Encoding: gzip y vacía al completar el manejador.
Respeta Accept-Encoding de los clientes.
Comparación en tiempo constante y operaciones de bytes que reducen los canales laterales de temporización.
Úsalo al comparar MACs o secretos hasheados.
Bien para detección de duplicados no adversarios.
Evita MD5 para contextos de seguridad; prefiere SHA-256 cuando los atacantes pueden elegir las entradas.
rand.New(rand.NewPCG(seed1, seed2)) y pasa el *rand.Rand al código bajo prueba.
No confíes en funciones de siembra globales en pruebas paralelas.
gzip.NewWriterLevel(w, gzip.BestCompression) intercambia CPU por tamaño.
El valor predeterminado es DefaultCompression, que equilibra velocidad y ratio.
Los hashes de contenido público están bien.
Los hashes de secretos aún filtran información de igualdad; trátalos con cuidado en logs multi-inquilino.
compress/flate implementa DEFLATE.
compress/gzip añade cabeceras gzip y suma de verificación alrededor de los streams flate.
Versiones de Stack: Esta página fue escrita para Go 1.26.x (predeterminado Green Tea GC, go fix modernizers - verificar parche en la compilación), chi (última - verificar en la compilación), gin (última - verificar en la compilación), echo (última - verificar en la compilación), google.golang.org/grpc (última - verificar en la compilación), sigs.k8s.io/controller-runtime (última - verificar en la compilación), kubebuilder (última - verificar en la compilación), tinygo (última - verificar objetivos de placa en la compilación), wazero (última - verificar en la compilación) y golangci-lint (última - verificar conjunto de linters en la compilación).
Revisado por Chris St. John·Última actualización: 16 jul 2026