Может ли кто-нибудь показать мне рабочий пример того, как генерировать SHA-хэш строки, которую я имею, скажем myPassword := "beautiful"
, используя Go 1?
На страницах документации отсутствуют примеры, и я не нашел рабочего кода в Google.
Может ли кто-нибудь показать мне рабочий пример того, как генерировать SHA-хэш строки, которую я имею, скажем myPassword := "beautiful"
, используя Go 1?
На страницах документации отсутствуют примеры, и я не нашел рабочего кода в Google.
Пример:
import (
"crypto/sha1"
"encoding/base64"
)
func (ms *MapServer) storee(bv []byte) {
hasher := sha1.New()
hasher.Write(bv)
sha := base64.URLEncoding.EncodeToString(hasher.Sum(nil))
...
}
В этом примере я делаю sha из массива байтов. Вы можете получить массив байтов, используя
bv := []byte(myPassword)
Конечно, вам не нужно кодировать его в base64, если вам это не нужно: вы можете использовать массив необработанных байтов, возвращаемый функцией Sum.
В комментариях, по-видимому, есть немного путаницы. Поэтому дайте пояснить следующим пользователям лучшие методы конверсии в строки:
В документации пакета на http://golang.org/pkg/crypto/sha1/ есть пример, демонстрирующий это. Он был указан как пример функции New, но это единственный пример на странице, и у него есть ссылка прямо в верхней части страницы, поэтому стоит посмотреть. Полный пример:
код:
h := sha1.New()
io.WriteString(h, "His money is twice tainted: 'taint yours and 'taint mine.")
fmt.Printf("% x", h.Sum(nil))
Вывод:
59 7f 6a 54 00 10 f9 4c 15 d7 18 06 a9 9a 2c 87 10 e7 47 bd
Перейти к примеру содержит страницу хэширования 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)
}
Вы можете запустить этот пример на play.golang.org
На самом деле вы можете сделать это гораздо более лаконично и идиоматично:
// 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)
В этом тривиальном примере http.Request POST, содержащем поле login_password, стоит отметить, что fmt.Sprintf() с %x
преобразовал хэш-значение в шестнадцатеричный без необходимости включать объявление import "encoding/hex"
.
(Мы использовали fmt.Sprintf() в отличие от fmt.Printf(), поскольку мы были вывод строки в назначение переменной, а не io.Writer.)
Также ссылается, что функция sha1.Sum() verbosely создает экземпляр так же, как 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()
}
Это справедливо (по крайней мере, во время публикации) для вариантов библиотеки Sha в стандартном наборе криптографии Голанг, например Sha512.
Наконец, если бы кто-то захотел, они могли бы следовать реализации Golang [to] String() с чем-то вроде func (h hash.Hash) String() string {...}
для инкапсуляции процесса.
Это скорее всего выходит за рамки требуемого объема исходного вопроса.
Вот несколько хороших примеров:
Второй пример предназначен для sha256, чтобы сделать sha1 hexadecimal:
// 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))
Вот функция, которую вы можете использовать для генерации хэша SHA1:
// SHA1 hashes using sha1 algorithm
func SHA1(text string) string {
algorithm := sha1.New()
algorithm.Write([]byte(text))
return hex.EncodeToString(algorithm.Sum(nil))
}
Я собрал группу этих хэш-функций полезности здесь: https://github.com/shomali11/util
Вы найдете FNV32
, FNV32a
, FNV64
, FNV65a
, MD5
, SHA1
, SHA256
и SHA512