Slide 32 de 37
Criptografia
Calculando hash
proc main(): void {
echo hive.crypto.sha256("hive")
echo hive.crypto.sha512("hive")
echo hive.crypto.hmacSha256("hive", "secret")
}
Cifrando e decifrando
proc main(): void {
sealed := hive.crypto.encrypt("um segredo", "password")
if hive.crypto.decrypt(sealed, "password") is Result.Ok(plain) {
echo plain
}
}
Codificação e bytes aleatórios
proc main(): void {
encoded := hive.crypto.base64Encode("hive")
if hive.crypto.base64Decode(encoded) is Result.Ok(decoded) {
echo decoded
}
echo hive.crypto.randomHex(8)
}
JWTs
type Claims { user: Str }
proc main(): void {
token := hive.crypto.jwtSign(Claims("ada"), "secret")
verified := hive.crypto.jwtVerify(token, "secret") with Claims
if verified is Result.Ok(claims) {
echo claims.user
}
echo hive.crypto.jwtHeader(token)
}
hive.crypto é puro, então funciona tanto em um func quanto em um proc. sha256 e sha512 calculam hash, e hmacSha256 autentica com uma chave. encrypt e decrypt selam uma string sob uma senha com AES-256-GCM, usando um salt e um nonce novos em cada chamada, então o mesmo texto nunca é criptografado da mesma forma duas vezes; base64Encode e base64Decode movem entre texto e base64, e randomHex sorteia bytes aleatórios. jwtSign, jwtVerify e jwtDecode cobrem JSON Web Tokens HS256 do início ao fim — jwtVerify verifica a assinatura e a expiração e aceita apenas HS256, eliminando de cara o clássico ataque de confusão de algoritmo, enquanto jwtDecode lê as claims sem verificar nada, e jwtHeader lê apenas alg/typ/kid.