si può effettivamente fare questo in un modo molto più conciso e idiomatica:
// 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)
In questo esempio banale di un POST http.Request contenente un campo login_password, è vale la pena notare che fmt.Sprintf() chiamato con %x
ha convertito il valore hash in hex senza dover includere una dichiarazione import "encoding/hex"
.
(Abbiamo usato fmt.Sprintf() anziché fmt.Printf() come ci hanno emettere una stringa di un'assegnazione variabile, non un'interfaccia io.Writer.)
Anche di riferimento, è che la funzione sha1.Sum() un'istanza verbosely nello stesso modo del sha1.New() definizione:
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()
}
Questo vale (almeno al momento del distacco) per le varianti della biblioteca Sha nel set standard di crittografia di Golang, come ad esempio Sha512.
Infine, se si desidera, potrebbero seguire l'implementazione [di] String() di Golang con qualcosa come func (h hash.Hash) String() string {...}
per incapsulare il processo.
Questo è molto probabilmente oltre lo scopo desiderato della domanda originale.
fonte
2015-02-25 20:01:45
Se la password hashing è in realtà quello che sei facendo, non dovresti usare SHA1 nudo per questo - usa PBKDF2, SCRYPT o BCRYPT. –
Sì, mi piacerebbe fare tutto ciò. Ma golang non supporta nessuno di loro in modo nativo e non voglio fare affidamento su librerie di terze parti. –
Quindi utilizzare Sha256. E non aver troppa paura: anche se ora si sa che sha1 non è teoricamente così forte come inizialmente pensavamo, un attacco brutale è ancora quasi impossibile. Non dimenticare di aggiungere un sale, però, per proteggere il tuo utente per le ricerche nel database. Con SHA 256 e un sale, sei a posto. –