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/bcryptExemplo 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
Também na biblioteca
Trabalhando com Kafka em Kotlin: bibliotecas, configuração e exemplos
Trabalhando com YAML em C# (.NET): bibliotecas e exemplos de uso