Подтвердить что ты не робот

Генерация SHA-хэша строки с использованием golang

Может ли кто-нибудь показать мне рабочий пример того, как генерировать SHA-хэш строки, которую я имею, скажем myPassword := "beautiful", используя Go 1?

На страницах документации отсутствуют примеры, и я не нашел рабочего кода в Google.

4b9b3361

Ответ 1

Пример:

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.

В комментариях, по-видимому, есть немного путаницы. Поэтому дайте пояснить следующим пользователям лучшие методы конверсии в строки:

  • вы никогда не храните SHA как строку в базе данных, а как raw bytes
  • когда вы хотите отображать SHA для пользователя, общий способ - Hexadecimal
  • когда вам нужно представление строки, потому что оно должно соответствовать URL-адресу или имени файла, обычным решением является Base64, что более компактный

Ответ 2

В документации пакета на 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

Ответ 4

На самом деле вы можете сделать это гораздо более лаконично и идиоматично:

// 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 {...} для инкапсуляции процесса.

Это скорее всего выходит за рамки требуемого объема исходного вопроса.

Ответ 5

Вот несколько хороших примеров:

Второй пример предназначен для 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))

(из https://github.com/soniah/dnsmadeeasy)

Ответ 6

Вот функция, которую вы можете использовать для генерации хэша 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