Criptografia em Go (Golang): criptografia e hash

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Criptografia em Go (Golang): guia completo de criptografia e hash



Go (Golang) fornece uma poderosa biblioteca padrão crypto, que inclui todas as ferramentas necessárias para implementar a proteção criptográfica de dados. Neste artigo, abordaremos em detalhes os principais recursos para trabalhar com criptografia e hash em Go, incluindo criptografia simétrica (AES), assimétrica (RSA), funções hash (SHA-256) e proteção de senhas com bcrypt.



1. Hash de dados em Go



Hash é uma transformação unidirecional de dados de comprimento fixo. Em Go, usa-se o pacote crypto/sha256 (e outras famílias SHA).



Exemplo: hash SHA-256 de uma string



package main

import ( "crypto/sha256" "fmt")

func main() { data := "PythonLib.ru — site educacional" hash := sha256.Sum256([]byte(data)) fmt.Printf("SHA-256: %x", hash)}


Saída: SHA-256: 3c4a5b6c7d8e9f0a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4



Para hash de fluxo (arquivos grandes), use a interface hash.Hash:



package main

import ( "crypto/sha256" "fmt" "io" "strings")

func main() { h := sha256.New() reader := strings.NewReader("Fluxo de dados para hash") io.Copy(h, reader) fmt.Printf("SHA-256 de fluxo: %x", h.Sum(nil))}


2. Proteção de senhas com bcrypt



Para armazenar senhas, nunca use hashes comuns (SHA-256). Use bcrypt — um algoritmo com salt e complexidade adaptativa. Em Go, isso é implementado pelo pacote golang.org/x/crypto/bcrypt.



Instalação:

go get golang.org/x/crypto/bcrypt


Exemplo de hash e verificação de senha:



package main

import ( "fmt" "golang.org/x/crypto/bcrypt")

func main() { password := "MySecurePass123!"

// Hash (custo padrão = 10) hash, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost) if err != nil { panic(err) } fmt.Printf("hash bcrypt: %s", hash)

// Verificação de senha err = bcrypt.CompareHashAndPassword(hash, []byte(password)) if err != nil { fmt.Println("Senha incorreta") } else { fmt.Println("Senha correta!") }}


3. Criptografia simétrica AES-GCM



AES (Advanced Encryption Standard) — algoritmo simétrico. O modo recomendado é GCM (Galois/Counter Mode), que fornece autenticação (AEAD). Use os pacotes crypto/aes e crypto/cipher.



Exemplo de criptografia e descriptografia AES-256-GCM:



package main

import ( "crypto/aes" "crypto/cipher" "crypto/rand" "encoding/hex" "fmt" "io")

func main() { key := []byte("Chave de 32 bytes para AES-256!!!") // 32 bytes plaintext := []byte("Mensagem secreta para PythonLib")

// Criptografia ciphertext, nonce := encryptAESGCM(key, plaintext) fmt.Printf("Criptografado: %s", hex.EncodeToString(ciphertext))

// Descriptografia decrypted, err := decryptAESGCM(key, ciphertext, nonce) if err != nil { panic(err) } fmt.Printf("Descriptografado: %s", decrypted)}

func encryptAESGCM(key, plaintext []byte) (ciphertext, nonce []byte) { block, _ := aes.NewCipher(key) gcm, _ := cipher.NewGCM(block) nonce = make([]byte, gcm.NonceSize()) io.ReadFull(rand.Reader, nonce) return gcm.Seal(nil, nonce, plaintext, nil), nonce}

func decryptAESGCM(key, ciphertext, nonce []byte) ([]byte, error) { block, _ := aes.NewCipher(key) gcm, _ := cipher.NewGCM(block) return gcm.Open(nil, nonce, ciphertext, nil)}


4. Criptografia assimétrica RSA



RSA usa

Recommendations