Algoritmos de hash en Go
Paquetes de hash de la biblioteca estándar
Go proporciona múltiples algoritmos de hash a través de paquetes de la biblioteca estándar:
graph TD
A[Go Hash Packages] --> B[crypto/md5]
A --> C[crypto/sha1]
A --> D[crypto/sha256]
A --> E[crypto/sha512]
A --> F[crypto/sha3]
Implementación de algoritmos de hash comunes
Hash SHA-256
package main
import (
"crypto/sha256"
"fmt"
)
func computeSHA256(data string) string {
hash := sha256.Sum256([]byte(data))
return fmt.Sprintf("%x", hash)
}
func main() {
message := "Hello, LabEx!"
hashValue := computeSHA256(message)
fmt.Println("SHA-256 Hash:", hashValue)
}
Hash MD5 (No recomendado por razones de seguridad)
package main
import (
"crypto/md5"
"fmt"
)
func computeMD5(data string) string {
hash := md5.Sum([]byte(data))
return fmt.Sprintf("%x", hash)
}
func main() {
message := "Hello, LabEx!"
hashValue := computeMD5(message)
fmt.Println("MD5 Hash:", hashValue)
}
Comparación de algoritmos de hash
Algoritmo |
Longitud de salida |
Nivel de seguridad |
Rendimiento |
MD5 |
128 bits |
Bajo |
Rápido |
SHA-1 |
160 bits |
Bajo |
Moderado |
SHA-256 |
256 bits |
Alto |
Moderado |
SHA-512 |
512 bits |
Muy alto |
Más lento |
Técnicas avanzadas de hashing
Hashes con sal
package main
import (
"crypto/sha256"
"encoding/hex"
)
func saltedHash(password, salt string) string {
data := password + salt
hash := sha256.Sum256([]byte(data))
return hex.EncodeToString(hash[:])
}
func main() {
password := "mySecurePassword"
salt := "randomSalt123"
hashedPassword := saltedHash(password, salt)
}
Mejores prácticas
- Utilice SHA-256 o SHA-3 para la mayoría de las aplicaciones.
- Siempre utilice sal al almacenar contraseñas.
- Evite MD5 y SHA-1 para tareas críticas de seguridad.
- Considere utilizar bcrypt para el hashing de contraseñas.
Consideraciones de rendimiento
graph LR
A[Input Data] --> B{Hash Algorithm}
B --> |MD5| C[Fastest]
B --> |SHA-256| D[Balanced]
B --> |SHA-512| E[Most Secure, Slowest]
Manejo de errores en hashing
package main
import (
"crypto/sha256"
"fmt"
)
func safeHashCompute(data []byte) (string, error) {
if len(data) == 0 {
return "", fmt.Errorf("empty input data")
}
hash := sha256.Sum256(data)
return fmt.Sprintf("%x", hash), nil
}