san - hash house a go go prices
Generar el hash SHA de una cadena usando golang (6)
Aquí hay algunos buenos ejemplos:
- http://golang.org/src/pkg/crypto/hmac/hmac_test.go
- http://www.jokecamp.com/blog/examples-of-creating-base64-hashes-using-hmac-sha256-in-different-languages/#go
El segundo ejemplo se dirige a sha256, para hacer sha1 hexadecimal harías:
// Calculate the hexadecimal HMAC SHA1 of requestDate using sKey
key := []byte(c.SKey)
h := hmac.New(sha1.New, key)
h.Write([]byte(requestDate))
hmacString := hex.EncodeToString(h.Sum(nil))
¿Puede alguien mostrarme un ejemplo práctico de cómo generar un hash SHA de una cadena que tengo, digamos myPassword := "beautiful"
, usando Go 1?
Las páginas de documentos carecen de ejemplos y no pude encontrar ningún código que funcione en Google.
Aquí hay una función que podría usar para generar un hash SHA1:
// SHA1 hashes using sha1 algorithm
func SHA1(text string) string {
algorithm := sha1.New()
algorithm.Write([]byte(text))
return hex.EncodeToString(algorithm.Sum(nil))
}
Reuní un grupo de esas funciones hash de utilidad aquí: https://github.com/shomali11/util
Encontrará FNV32
, FNV32a
, FNV64
, FNV65a
, MD5
, SHA1
, SHA256
y SHA512
De hecho, puedes hacer esto de una manera mucho más concisa e idiomática:
// 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 una POST http.Request contiene un campo login_password, vale la pena señalar que fmt.Sprintf() llamado con %x
convirtió el valor hash en hexadecimal sin tener que incluir una declaración de import "encoding/hex"
.
(Utilizamos fmt.Sprintf() en lugar de fmt.Printf() ya que estábamos enviando una cadena a una asignación de variable, no a una interfaz io.Writer ).
También de referencia, es que la función sha1.Sum() ejemplifica con mucha precisión de la misma manera que la definición sha1.New() :
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 el conjunto de cifrado estándar de Golang, como Sha512 .
Por último, si uno quisiera, podrían seguir la implementación de [to] String () de func (h hash.Hash) String() string {...}
con algo como func (h hash.Hash) String() string {...}
para encapsular el proceso.
Eso es más probable más allá del alcance deseado de la pregunta original.
La documentación del paquete en http://golang.org/pkg/crypto/sha1/ tiene un ejemplo que demuestra esto. Se indica como un ejemplo de la función Nueva, pero es el único ejemplo en la página y tiene un enlace justo cerca de la parte superior de la página, por lo que vale la pena mirarlo. El ejemplo completo es
Código:
h := sha1.New()
io.WriteString(h, "His money is twice tainted: ''taint yours and ''taint mine.")
fmt.Printf("% x", h.Sum(nil))
Salida:
59 7f 6a 54 00 10 f9 4c 15 d7 18 06 a9 9a 2c 87 10 e7 47 bd
Un ejemplo :
import (
"crypto/sha1"
"encoding/base64"
)
func (ms *MapServer) storee(bv []byte) {
hasher := sha1.New()
hasher.Write(bv)
sha := base64.URLEncoding.EncodeToString(hasher.Sum(nil))
...
}
En este ejemplo, hago un sha de una matriz de bytes. Puedes obtener la matriz de bytes usando
bv := []byte(myPassword)
Por supuesto, no necesita codificarlo en base64 si no es necesario: puede usar la matriz de bytes sin procesar devuelta por la función Suma.
Parece haber algo de confusión en los comentarios a continuación. Así que aclaremos para los próximos usuarios las mejores prácticas en conversiones a cadenas:
- nunca almacena un SHA como una cadena en una base de datos, sino como bytes sin procesar
- cuando desea mostrar un SHA a un usuario, una forma común es Hexadecimal
- cuando desea una representación de cadena porque debe caber en una URL o en un nombre de archivo, la solución habitual es Base64 , que es más compacto
Ir por ejemplo tiene una página en hash sha1.
package main
import (
"fmt"
"crypto/sha1"
"encoding/hex"
)
func main() {
s := "sha1 this string"
h := sha1.New()
h.Write([]byte(s))
sha1_hash := hex.EncodeToString(h.Sum(nil))
fmt.Println(s, sha1_hash)
}