Criptografía en Go (Golang): cifrado y hash
Go (Golang) es un lenguaje compilado moderno, conocido por su rendimiento y soporte integrado para algoritmos criptográficos. La biblioteca estándar crypto proporciona todo lo necesario para proteger datos: desde hash simple hasta cifrado asimétrico complejo. En este artículo, analizaremos las herramientas principales y mostraremos ejemplos prácticos de código.
¿Por qué es necesaria la criptografía en Go?
La criptografía en Go se utiliza para:
- Almacenamiento de contraseñas (hash);
- Transmisión de datos a través de la red (TLS/SSL);
- Firmas digitales y autenticación;
- Cifrado de archivos confidenciales.
Go garantiza la seguridad gracias a una API bien diseñada: es difícil usar accidentalmente un algoritmo obsoleto o inseguro.
Hash en Go
El hash es una transformación unidireccional de datos en una cadena de longitud fija. En Go, los paquetes crypto/md5, crypto/sha1, crypto/sha256 y crypto/sha512 se encargan de esto.
Ejemplo: hash SHA-256
package main
import ( "crypto/sha256" "fmt")
func main() { data := []byte("Datos secretos") hash := sha256.Sum256(data) fmt.Printf("SHA256: %x", hash)}Salida: SHA256: 3c3b... (64 caracteres)
Hash con sal para contraseñas
Para almacenar contraseñas de forma segura, use crypto/rand para generar la sal y crypto/sha256:
package main
import ( "crypto/rand" "crypto/sha256" "fmt")
func main() { password := []byte("MiContraseña123") salt := make([]byte, 16) rand.Read(salt) salted := append(salt, password...) hash := sha256.Sum256(salted) fmt.Printf("Sal: %x", salt) fmt.Printf("Hash: %x", hash)}En la práctica, para contraseñas es mejor usar bcrypt (paquete golang.org/x/crypto/bcrypt), pero SHA-256 con sal es una buena opción para aprender.
Cifrado simétrico: AES
AES (Advanced Encryption Standard) es el algoritmo simétrico más popular. En Go está implementado en el paquete crypto/aes junto con modos de cifrado (crypto/cipher).
Ejemplo: cifrado AES-GCM
package main
import ( "crypto/aes" "crypto/cipher" "crypto/rand" "fmt")
func main() { key := []byte("0123456789abcdef0123456789abcdef") // 32 bytes para AES-256 plaintext := []byte("Mensaje confidencial") block, _ := aes.NewCipher(key) aead, _ := cipher.NewGCM(block) nonce := make([]byte, aead.NonceSize()) rand.Read(nonce) ciphertext := aead.Seal(nil, nonce, plaintext, nil) fmt.Printf("Cifrado: %x", ciphertext) // Descifrado decrypted, _ := aead.Open(nil, nonce, ciphertext, nil) fmt.Printf("Descifrado: %s", decrypted)}GCM (Galois/Counter Mode) proporciona confidencialidad y autenticación: la mejor opción para la mayoría de las tareas.
Cifrado asimétrico: RSA
RSA utiliza un par de claves (pública y privada). En Go está implementado en crypto/rsa y crypto/rand.
Generación de claves y cifrado
package main
import ( "crypto/rand" "crypto/rsa" "crypto/sha256" "fmt")
func main() { privateKey, _ := rsa.GenerateKey(rand.Reader, 2048) publicKey := &privateKey.PublicKey message := []byte("Secreto para RSA") label := []byte("") // Cifrado con clave pública ciphertext, _ := rsa.EncryptOAEP(sha256.New(), rand.Reader, publicKey, message, label) fmt.Printf("Cifrado RSA: %x", ciphertext) // Descifrado con clave privada plaintext, _ := rsa.DecryptOAEP(sha También en la biblioteca
Configuración de aplicaciones Swift: biblioteca SwiftyConfig
CsvHelper para C# (.NET): guía completa con ejemplos
Integración de métricas Prometheus en aplicaciones C++: biblioteca prometheus-cpp
GraphQL en C# (.NET): bibliotecas Hot Chocolate y GraphQL.NET para crear API