std.crypto — Criptografia
O módulo std.crypto fornece implementações criptográficas de alta qualidade escritas em Zig puro (sem dependências de C). Ele inclui funções de hash, cifras simétricas e assimétricas, autenticação de mensagens (MAC), geração de números aleatórios criptograficamente seguros e funções de derivação de chaves. Todas as implementações visam resistência a ataques de canal lateral (side-channel attacks).
Visão Geral
const std = @import("std");
const crypto = std.crypto;
Organização do Módulo
std.crypto
├── hash — Funções de hash (SHA-2, SHA-3, Blake)
├── auth — Autenticação de mensagens (HMAC, Poly1305)
├── aead — Cifras autenticadas (AES-GCM, ChaCha20-Poly1305)
├── sign — Assinaturas digitais (Ed25519)
├── dh — Troca de chaves (X25519)
├── kdf — Derivação de chaves (HKDF)
├── pwhash — Hashing de senhas (Argon2, bcrypt)
├── random — Geração aleatória segura
└── certificate — Certificados X.509
Funções de Hash
// SHA-2
crypto.hash.sha2.Sha256 // SHA-256
crypto.hash.sha2.Sha512 // SHA-512
// SHA-3
crypto.hash.sha3.Sha3_256 // SHA3-256
// BLAKE
crypto.hash.Blake2b256 // BLAKE2b-256
crypto.hash.Blake3 // BLAKE3
Cifras
// AES-GCM
crypto.aead.aes_gcm.Aes256Gcm
// ChaCha20-Poly1305
crypto.aead.chacha_poly.ChaCha20Poly1305
Exemplo 1: Hash de Dados e Arquivos
const std = @import("std");
const crypto = std.crypto;
pub fn main() !void {
const stdout = std.io.getStdOut().writer();
// SHA-256 de uma string
const dados = "Zig é seguro por design";
var hash: [crypto.hash.sha2.Sha256.digest_length]u8 = undefined;
crypto.hash.sha2.Sha256.hash(dados, &hash, .{});
try stdout.print("SHA-256: ", .{});
for (hash) |byte| {
try stdout.print("{x:0>2}", .{byte});
}
try stdout.writeAll("\n");
// BLAKE3
var blake_hash: [crypto.hash.Blake3.digest_length]u8 = undefined;
crypto.hash.Blake3.hash(dados, &blake_hash, .{});
try stdout.print("BLAKE3: ", .{});
for (blake_hash) |byte| {
try stdout.print("{x:0>2}", .{byte});
}
try stdout.writeAll("\n");
// Hash incremental (streaming)
var hasher = crypto.hash.sha2.Sha256.init(.{});
hasher.update("parte 1 ");
hasher.update("parte 2 ");
hasher.update("parte 3");
var hash_incremental: [32]u8 = undefined;
hasher.final(&hash_incremental);
try stdout.print("SHA-256 (incremental): ", .{});
for (hash_incremental) |byte| {
try stdout.print("{x:0>2}", .{byte});
}
try stdout.writeAll("\n");
}
Exemplo 2: Geração Aleatória Segura
const std = @import("std");
const crypto = std.crypto;
pub fn main() !void {
const stdout = std.io.getStdOut().writer();
// Bytes aleatórios criptograficamente seguros
var bytes: [32]u8 = undefined;
crypto.random.bytes(&bytes);
try stdout.writeAll("Bytes aleatórios: ");
for (bytes) |b| {
try stdout.print("{x:0>2}", .{b});
}
try stdout.writeAll("\n");
// Inteiro aleatório em range
const valor = crypto.random.intRangeAtMost(u32, 1, 100);
try stdout.print("Número aleatório (1-100): {d}\n", .{valor});
// Token hexadecimal
var token: [16]u8 = undefined;
crypto.random.bytes(&token);
try stdout.writeAll("Token: ");
for (token) |b| {
try stdout.print("{x:0>2}", .{b});
}
try stdout.writeAll("\n");
// Shuffle de um array
var cartas = [_]u8{ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
crypto.random.shuffle(u8, &cartas);
try stdout.writeAll("Cartas embaralhadas: ");
for (cartas) |c| {
try stdout.print("{d} ", .{c});
}
try stdout.writeAll("\n");
}
Exemplo 3: HMAC para Autenticação de Mensagens
const std = @import("std");
const crypto = std.crypto;
const HmacSha256 = crypto.auth.hmac.HmacSha256;
fn gerarHmac(chave: []const u8, mensagem: []const u8) [HmacSha256.mac_length]u8 {
var mac: [HmacSha256.mac_length]u8 = undefined;
HmacSha256.create(&mac, mensagem, chave);
return mac;
}
fn verificarHmac(chave: []const u8, mensagem: []const u8, mac_esperado: []const u8) bool {
var mac: [HmacSha256.mac_length]u8 = undefined;
HmacSha256.create(&mac, mensagem, chave);
// Comparação em tempo constante (previne timing attack)
return std.crypto.utils.timingSafeEql([HmacSha256.mac_length]u8, mac, mac_esperado[0..HmacSha256.mac_length].*);
}
pub fn main() !void {
const stdout = std.io.getStdOut().writer();
const chave = "minha-chave-secreta-muito-longa";
const mensagem = "Transferir R$1000 para conta 12345";
// Gera HMAC
const mac = gerarHmac(chave, mensagem);
try stdout.writeAll("Mensagem: ");
try stdout.print("{s}\n", .{mensagem});
try stdout.writeAll("HMAC: ");
for (mac) |byte| {
try stdout.print("{x:0>2}", .{byte});
}
try stdout.writeAll("\n");
// Verifica
const valido = verificarHmac(chave, mensagem, &mac);
try stdout.print("Verificação: {}\n", .{valido});
// Mensagem adulterada
const adulterada = "Transferir R$9999 para conta 12345";
const invalido = verificarHmac(chave, adulterada, &mac);
try stdout.print("Adulterada: {}\n", .{invalido});
}
Algoritmos Disponíveis
| Categoria | Algoritmos |
|---|---|
| Hash | SHA-256, SHA-512, SHA3-256, BLAKE2b, BLAKE3 |
| AEAD | AES-128-GCM, AES-256-GCM, ChaCha20-Poly1305 |
| MAC | HMAC-SHA256, Poly1305 |
| Assinatura | Ed25519 |
| Troca de chaves | X25519 |
| KDF | HKDF |
| Senha | Argon2, bcrypt |
Módulos Relacionados
- std.crypto.hash — Funções de hash detalhadas
- std.crypto.random — Geração aleatória segura
- std.base64 — Codificação Base64
- std.fmt — Formatação hexadecimal