web-dev-qa-db-ja.com

golangを使用して文字列のSHAハッシュを生成する

誰かが私が持っている文字列のSHAハッシュ、たとえばmyPassword := "beautiful"、Go 1を使用しますか?

ドキュメントページには例がなく、Googleで動作するコードを見つけることができませんでした。

41
Sankar

例 :

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をデータベースの文字列としてではなく、生のバイトとして保存することはありません
  • SHAをユーザーに表示する場合、一般的な方法は 16進数
  • uRLまたはファイル名に収まらなければならないために文字列表現が必要な場合、通常の解決策は Base64 で、これはよりコンパクトです
60
Denys Séguret

Go By Example には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でこの例を実行

32
Xeoncross

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

28
Sonia

実際には、これをはるかに簡潔で慣用的な方法で実行できます。

_// 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"_宣言を含めることなくハッシュ値を16進数に変換しました。

fmt.Sprintf() を使用したのに対し、 fmt.Printf()io.Writer インターフェイスではなく、変数割り当てに文字列を出力していたため)

また、 sha1.Sum() 関数は、 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()
}
_

これは、 Sha512 のようなGolangの標準暗号セットのShaライブラリバリアントに(少なくとも投稿時点で)当てはまります。

最後に、必要に応じて、Golangの[to] String()実装にfunc (h hash.Hash) String() string {...}のようなものを付けてプロセスをカプセル化できます。

これは、おそらく元の質問の望ましい範囲を超えています。

13
Mike Pearson

ここにいくつかの良い例があります:

2番目の例では、sha256をターゲットとして、sha1 16進数を実行します。

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

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

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

見つけるだろう FNV32FNV32aFNV64FNV65aMD5SHA1SHA256およびSHA512

0
Raed Shomali