En realidad se puede hacer esto de una manera mucho más concisa e idiomático:
// Assuming 'r' is set to some inbound net/http request
form_value := []byte(r.PostFormValue("login_password"))
sha1_hash := fmt.Sprintf("%x", sha1.Sum(form_value))
// Then output optionally, to test
fmt.Println(sha1_hash)
En este ejemplo trivial de un puesto http.Request que contiene un campo login_password, es vale la pena señalar que fmt.Sprintf() llamado con %x
convirtió el valor hash a hexadecimal sin tener que incluir una declaración import "encoding/hex"
.
(utilizamos fmt.Sprintf() en contraposición a fmt.Printf() como estábamos la salida de una cadena a una asignación de variable, no una interfaz io.Writer.)
también de referencia, es decir que la función sha1.Sum() instancia más detallados de la misma manera como el sha1.New() definición:
func New() hash.Hash {
d := new(digest)
d.Reset()
return d
}
func Sum(data []byte) [Size]byte {
var d digest
d.Reset()
d.Write(data)
return d.checkSum()
}
Esto es cierto (al menos en el momento de la publicación) para las variantes de la biblioteca Sha en conjunto estándar de cifrado de Golang, como Sha512.
Por último, si uno quisiera, podrían seguir la implementación de Golang [to] String() con algo como func (h hash.Hash) String() string {...}
para encapsular el proceso.
Eso es muy probablemente más allá del alcance deseado de la pregunta original.
Si la contraseña es lo que realmente eres haciendo, no debería usar SHA1 desnudo para esto - use PBKDF2, SCRYPT o BCRYPT. –
Sí, me gustaría hacer algo de eso. Pero golang no admite ninguno de ellos de forma nativa y no quiero depender de bibliotecas de terceros. –
Así que use Sha256. Y no tengas miedo: incluso si ahora se sabe que sha1 teóricamente no es tan fuerte como inicialmente pensamos que era, un ataque bruto es casi imposible. No olvide agregar una sal, para proteger a su usuario de las búsquedas en la base de datos. Con SHA 256 y una sal, estás bien. –