web-dev-qa-db-fra.com

Générer le SHA hachage d'une chaîne à l'aide de golang

Quelqu'un peut-il me montrer un exemple de travail pour générer un SHA hachage d'une chaîne que j'ai, disons myPassword := "beautiful", en utilisant Go 1?

Les pages de documentation manquent d'exemples et je n'ai trouvé aucun code de travail sur Google.

41
Sankar

Un exemple :

import (
    "crypto/sha1"
    "encoding/base64"
)

func (ms *MapServer) storee(bv []byte) {
    hasher := sha1.New()
    hasher.Write(bv)
    sha := base64.URLEncoding.EncodeToString(hasher.Sum(nil))
        ...
}

Dans cet exemple, je crée un sha à partir d'un tableau d'octets. Vous pouvez obtenir le tableau d'octets en utilisant

bv := []byte(myPassword) 

Bien sûr, vous n'avez pas besoin de le coder en base64 si vous n'êtes pas obligé: vous pouvez utiliser le tableau d'octets bruts renvoyé par la fonction Sum.

Il semble y avoir une petite confusion dans les commentaires ci-dessous. Clarifions donc pour les prochains utilisateurs les meilleures pratiques en matière de conversion en chaînes:

  • vous ne stockez jamais un SHA sous forme de chaîne dans une base de données, mais sous forme d'octets bruts
  • lorsque vous souhaitez afficher un SHA pour un utilisateur, un moyen courant est hexadécimal
  • lorsque vous voulez une représentation sous forme de chaîne car elle doit tenir dans une URL ou dans un nom de fichier, la solution habituelle est Base64 , qui est plus compact
60
Denys Séguret

Go By Example a une page sur le hachage 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)
}

Vous pouvez exécutez cet exemple sur play.golang.org

32
Xeoncross

La documentation du paquet sur http://golang.org/pkg/crypto/sha1/ a un exemple qui le démontre. Il est indiqué comme un exemple de la fonction Nouveau, mais c'est le seul exemple sur la page et il a un lien juste en haut de la page, donc ça vaut le coup de le regarder. L'exemple complet est,

Code:

h := sha1.New()
io.WriteString(h, "His money is twice tainted: 'taint yours and 'taint mine.")
fmt.Printf("% x", h.Sum(nil))

Sortie:

59 7f 6a 54 00 10 f9 4c 15 d7 18 06 a9 9a 2c 87 10 e7 47 bd

28
Sonia

Vous pouvez réellement le faire de manière beaucoup plus concise et idiomatique:

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

Dans cet exemple trivial d'un http.Request POST contenant un champ login_password, il convient de noter que fmt.Sprintf () appelé avec %x A converti la valeur de hachage en hexadécimal sans avoir à inclure une déclaration import "encoding/hex".

(Nous avons utilisé fmt.Sprintf () par opposition à fmt.Printf () car nous sortions une chaîne dans une affectation de variable, pas un io.Writer interface.)

Il convient également de noter que la fonction sha1.Sum () instancie verbalement de la même manière que la définition 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()
}

Cela est vrai (au moins au moment de la publication) pour les variantes de la bibliothèque Sha dans l'ensemble de cryptographie standard de Golang, telles que Sha512 .

Enfin, si on le voulait, ils pourraient suivre l'implémentation [to] String () de Golang avec quelque chose comme func (h hash.Hash) String() string {...} pour encapsuler le processus.

Cela dépasse très probablement la portée souhaitée de la question initiale.

13
Mike Pearson

Voici quelques bons exemples:

Le deuxième exemple cible sha256, pour faire sha1 hexadécimal, vous feriez:

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

(depuis https://github.com/soniah/dnsmadeeasy )

5
Sonia Hamilton
h := sha1.New()
h.Write(content)
sha := h.Sum(nil)  // "sha" is uint8 type, encoded in base16

shaStr := hex.EncodeToString(sha)  // String representation

fmt.Printf("%x\n", sha)
fmt.Println(shaStr)

1
Ritwik
// Get sha1 from string
func Hashstr(Txt string) string {
    h := sha1.New()
    h.Write([]byte(Txt))
    bs  := h.Sum(nil)
    sh:= string(fmt.Sprintf("%x\n", bs))
    return sh
}
0
Arthur Savage

Voici une fonction que vous pouvez utiliser pour générer un hachage SHA1:

// SHA1 hashes using sha1 algorithm
func SHA1(text string) string {
    algorithm := sha1.New()
    algorithm.Write([]byte(text))
    return hex.EncodeToString(algorithm.Sum(nil))
}

J'ai rassemblé un groupe de ces fonctions de hachage utilitaires ici: https://github.com/shomali11/util

Tu trouveras FNV32, FNV32a, FNV64, FNV65a, MD5, SHA1, SHA256 et SHA512

0
Raed Shomali