crypto/*, compress & math/rand/v2
Hashing, primitivas de criptografia, compressão e aleatoriedade residem em pacotes focados da biblioteca padrão.
Busque em todas as páginas da documentação
Hashing, primitivas de criptografia, compressão e aleatoriedade residem em pacotes focados da biblioteca padrão.
A aleatoriedade sensível à segurança vem de crypto/rand; simulação e embaralhamento usam math/rand/v2.
Pacotes de compressão envolvem io.Reader e io.Writer para que pipelines HTTP e de arquivos permaneçam em streaming.
Use crypto/sha256 e similares para checksums e endereçamento de conteúdo.
Use crypto/tls e crypto/x509 para listeners HTTPS e TLS mútuo.
Use compress/gzip para encolher payloads sem carregar arquivos inteiros na memória.
Trate math/rand/v2 como a API moderna para aleatoriedade não criptográfica com valores Rand explícitos.
Cartão de referência rápida - pronto para copiar e colar.
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)Quando usar:
rand/v2 semeado.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"}))
}O que isso demonstra:
sha256.New como io.Writer para hashing incremental.gzip.NewWriter com Close obrigatório para descarregar trailers.crypto/rand.Read para tokens imprevisíveis.math/rand/v2 com fonte PCG explícita e Shuffle.hash.Hash (Write, Sum, Reset) para entrada em streaming.crypto/rand lê do CSPRNG do sistema operacional (getrandom, /dev/urandom, etc.).gzip.Writer comprime em um io.Writer subjacente; leitores descomprimem simetricamente.math/rand/v2 remove o estado mutável global do design do pacote legado math/rand.| Pacote | Função | Seguro para Criptografia? |
|---|---|---|
crypto/sha256 | Digest | N/A (hash, não sigilo) |
crypto/rand | Bytes aleatórios | Sim |
crypto/tls | Configuração e handshakes TLS | Sim (quando configurado corretamente) |
compress/gzip | DEFLATE + formatação gzip | N/A |
math/rand/v2 | Pseudo-aleatório rápido | Não |
// Compare digests em tempo constante ao proteger segredos:
import "crypto/subtle"
subtle.ConstantTimeCompare(a, b) == 1
// Versão mínima TLS para servidores:
cfg := &tls.Config{MinVersion: tls.VersionTLS12}crypto/rand.Read para segredos; rand/v2 apenas para usos não relacionados à segurança.Close e verifique o erro.Reset antes de fazer hash de um novo payload na mesma instância.crypto/aes ou TLS para confidencialidade.*rand.Rand de rand/v2 com semente explícita nos testes.| Alternativa | Usar Quando | Não Usar Quando |
|---|---|---|
Módulos blake2 / bcrypt | Necessidade de hashing de senha | Checksums de conteúdo simples (sha256 é suficiente) |
zstd de terceiros | Melhor taxa de compressão | Implantação que requer apenas a biblioteca padrão |
Bindings openssl | Requisitos de cifra legados | Go tls cobre implantações modernas |
| Módulos de segurança de hardware | Material de chave nunca na RAM | Desenvolvimento local e serviços pequenos |
crypto/rand para chaves, tokens e qualquer coisa que, se adivinhada por um atacante, quebraria a segurança.
math/rand/v2 para simulações, jitter de teste de carga e embaralhamentos de teste determinísticos com sementes explícitas.
Valores Rand explícitos substituem o estado global oculto.
Algoritmos como PCG e ChaCha8 estão disponíveis com APIs de semeadura mais claras.
O math/rand legado permanece para compatibilidade.
Abra o arquivo, use io.Copy em sha256.New(), depois Sum(nil).
O mesmo padrão funciona para hashers MD5 e SHA-512.
Não.
compress/gzip é um wrapper gzip de fluxo único.
Arquivos ZIP precisam de archive/zip, um formato diferente.
Passe tls.Config com Certificates ou GetCertificate para http.Server ou tls.Listen.
Carregue arquivos PEM com tls.LoadX509KeyPair ou use automação ACME externamente.
Sim.
Envolva ResponseWriter com gzip.NewWriter, defina Content-Encoding: gzip e descarregue ao final do manipulador.
Respeite Accept-Encoding dos clientes.
Comparação em tempo constante e operações de byte que reduzem canais laterais de tempo.
Use ao comparar MACs ou segredos com hash.
Serve para detecção de duplicatas não adversariais.
Evite MD5 para contextos de segurança; prefira SHA-256 quando atacantes puderem escolher as entradas.
Use rand.New(rand.NewPCG(seed1, seed2)) e passe o *rand.Rand para o código em teste.
Não confie em funções de semente globais em testes paralelos.
Use gzip.NewWriterLevel(w, gzip.BestCompression) que troca CPU por tamanho.
O padrão é DefaultCompression, equilibrando velocidade e taxa.
Hashes de conteúdo público são aceitáveis.
Hashes de segredos ainda vazam informações de igualdade; trate com cuidado em logs multi-inquilino.
compress/flate implementa DEFLATE.
compress/gzip adiciona cabeçalhos gzip e checksum em torno de fluxos flate.
Versões da Stack: Esta página foi escrita para Go 1.26.x (padrão GC Green Tea, go fix modernizers - verifique o patch na compilação), chi (última versão - verifique na compilação), gin (última versão - verifique na compilação), echo (última versão - verifique na compilação), google.golang.org/grpc (última versão - verifique na compilação), sigs.k8s.io/controller-runtime (última versão - verifique na compilação), kubebuilder (última versão - verifique na compilação), tinygo (última versão - verifique os alvos de placa na compilação), wazero (última versão - verifique na compilação) e golangci-lint (última versão - verifique o conjunto de linters na compilação).
Revisado por Chris St. John·Última atualização: 16 de jul. de 2026