Criptografía en Go (Golang): cifrado y hashing

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): 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/bcrypt


Ejemplo 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

Recommendations