Criptografía en Go: cifrado y hash para principiantes

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

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

Recommendations