72

myPassword := "beautiful"たとえば、Go 1を使用して、私が持っている文字列のSHAハッシュを生成する方法の実用的な例を誰かに教えてもらえますか?

ドキュメントページには例がなく、Googleで機能するコードが見つかりませんでした。

4

8 に答える 8

90

例 :

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です。
于 2012-05-22T12:22:08.053 に答える
72

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 で実行できます

于 2015-02-05T17:18:30.363 に答える
28

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

于 2012-05-22T20:11:40.463 に答える
19

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

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

このlogin_password フィールドを含むhttp.Request POSTの簡単な例では、 fmt.Sprintf()が、宣言%xを含めることなくハッシュ値を 16 進数に変換して呼び出されたことに注意してください。import "encoding/hex"

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

また、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()
}

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

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

これは、元の質問の望ましい範囲を超えている可能性が最も高いです。

于 2015-02-25T20:01:45.367 に答える
9
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)

于 2019-04-03T11:33:12.283 に答える
7

いくつかの良い例を次に示します。

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

于 2014-12-04T12:23:20.417 に答える