Criptografía en Go (Golang): guía completa de cifrado y hashing
Go (Golang) proporciona una potente biblioteca estándar crypto, que incluye todas las herramientas necesarias para implementar la protección criptográfica de datos. En este artículo, analizaremos en detalle las principales capacidades para trabajar con cifrado y hashing en Go, incluyendo cifrado simétrico (AES), asimétrico (RSA), funciones hash (SHA-256) y protección de contraseñas con bcrypt.
1. Hashing de datos en Go
El hashing es una transformación unidireccional de datos de longitud fija. En Go, se utiliza el paquete crypto/sha256 (y otras familias SHA).
Ejemplo: Hash SHA-256 de una cadena
package main
import ( "crypto/sha256" "fmt")
func main() { data := "PythonLib.ru — sitio educativo" hash := sha256.Sum256([]byte(data)) fmt.Printf("SHA-256: %x", hash)}Salida: SHA-256: 3c4a5b6c7d8e9f0a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4
Para hashing en flujo (archivos grandes), use la interfaz hash.Hash:
package main
import ( "crypto/sha256" "fmt" "io" "strings")
func main() { h := sha256.New() reader := strings.NewReader("Flujo de datos para hashing") io.Copy(h, reader) fmt.Printf("SHA-256 en flujo: %x", h.Sum(nil))}2. Protección de contraseñas con bcrypt
Para almacenar contraseñas, nunca use hashes simples (SHA-256). Use bcrypt, un algoritmo con sal y complejidad adaptativa. En Go, esto se implementa con el paquete golang.org/x/crypto/bcrypt.
Instalación:
go get golang.org/x/crypto/bcryptEjemplo de hashing y verificación de contraseña:
package main
import ( "fmt" "golang.org/x/crypto/bcrypt")
func main() { password := "MySecurePass123!"
// Hashing (costo por defecto = 10) hash, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost) if err != nil { panic(err) } fmt.Printf("hash bcrypt: %s", hash)
// Verificación de contraseña err = bcrypt.CompareHashAndPassword(hash, []byte(password)) if err != nil { fmt.Println("Contraseña incorrecta") } else { fmt.Println("¡Contraseña correcta!") }}3. Cifrado simétrico AES-GCM
AES (Advanced Encryption Standard) es un algoritmo simétrico. El modo recomendado es GCM (Galois/Counter Mode), que proporciona autenticación (AEAD). Use los paquetes crypto/aes y crypto/cipher.
Ejemplo de cifrado y descifrado AES-256-GCM:
package main
import ( "crypto/aes" "crypto/cipher" "crypto/rand" "encoding/hex" "fmt" "io")
func main() { key := []byte("Clave de 32 bytes para AES-256!!!") // 32 bytes plaintext := []byte("Mensaje secreto para PythonLib")
// Cifrado ciphertext, nonce := encryptAESGCM(key, plaintext) fmt.Printf("Cifrado: %s", hex.EncodeToString(ciphertext))
// Descifrado decrypted, err := decryptAESGCM(key, ciphertext, nonce) if err != nil { panic(err) } fmt.Printf("Descifrado: %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. Cifrado asimétrico RSA
RSA utiliza
También en la biblioteca
Generación de Swagger/OpenAPI para TypeScript: mejores herramientas
Caching en Java: Redis, Caffeine, Ehcache — guía completa
Migraciones de bases de datos en C++: revisión de herramientas y bibliotecas
Biblioteca GraphQL en C++: implementación de API con graphql-cpp