Cuando escribes aplicaciones web que almacenan contraseñas para tus usuarios, nunca es una buena idea almacenarlas como texto plano en tu base de datos, ya sea NoSQL o RDBMS. El año pasado escribí sobre usando BCrypt con Node.js y Couchbase así como usando BCrypt con Java y Couchbase. ¿Y si quisiéramos llevar esto a Golang?
Vamos a ver cómo hash contraseñas en una aplicación Golang utilizando BCrypt para almacenarlos de forma segura en Couchbase.
Para dejar las cosas claras, nos interesa el hash de contraseñas, no el cifrado de contraseñas, porque el cifrado implica que el descifrado es posible. El hashing es un proceso unidireccional.
Lo bueno de Go es que hay un a BCrypt incorporado. Cuando uses este paquete o hagas cualquier cosa relacionada con BCrypt, te vas a centrar en dos funciones. La generación de un hash y la comparación o validación de un hash.
En Go, podrías generar un nuevo hash basado en tu cadena de contraseñas como el siguiente:
|
1 |
hash, err := bcrypt.GenerarDesdeContraseña([]byte("mi-contraseña"), 10) |
Utilización de la GenerarDesdeContraseña se pasa una cadena y un valor de coste. Cuanto mayor sea el valor de coste, más lenta será la función, ya que el valor de coste es el número de veces que se aplica el hash.
Si alguna vez quisieras ver si una contraseña en texto plano coincide con una contraseña hash, podrías ejecutar lo siguiente:
|
1 |
err = bcrypt.CompareHashAndPassword([]byte("hashed-password"), []byte("plaintext-password")) |
Si no se produce ningún error, las contraseñas coinciden.
¿Cómo se puede utilizar esta función de hash de contraseñas con Couchbase?
Tomemos como ejemplo lo siguiente:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
tipo Cuenta struct { Tipo cadena `json:"tipo,omitempty"` Correo electrónico cadena `json:"email,omitempty"` Contraseña cadena `json:"contraseña,omitempty"` } func principal() { grupo, _ := gocb.Conectar("couchbase://localhost") cubo, _ := grupo.OpenBucket("por defecto", "") correo electrónico := "test@example.com" pase := "mi-contraseña" hash, _ := bcrypt.GenerarDesdeContraseña([]byte(pase), 10) cuenta := Cuenta{ Tipo: "cuenta", Correo electrónico: correo electrónico, Contraseña: cadena(hash), } cubo.Inserte(correo electrónico, cuenta, 0) cuenta = Cuenta{} cubo.Visite(correo electrónico, &cuenta) err := bcrypt.CompareHashAndPassword([]byte(cuenta.Contraseña), []byte(pase)) si err != nil { fmt.Imprimir(err.Error()) } } |
El anterior es un ejemplo muy burdo, pero sirve para entender cómo se podría almacenar la contraseña BCrypt y cómo compararla con ella.
Conclusión
Acabas de ver cómo usar BCrypt en una aplicación Golang. Es fundamental que la información sensible, como las contraseñas, se hash antes de que terminen en su base de datos, ya sea NoSQL o cualquier otra cosa.
Para obtener más información sobre el uso de Couchbase con Golang, consulte el documento Portal para desarrolladores de Couchbase.