myPassword := "beautiful"
たとえば、Go 1を使用して、私が持っている文字列のSHAハッシュを生成する方法の実用的な例を誰かに教えてもらえますか?
ドキュメントページには例がなく、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 関数によって返される生のバイト配列を使用できます。
以下のコメントには少し混乱があるようです。次のユーザーのために、文字列への変換に関するベスト プラクティスを明確にしましょう。
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)
}
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
実際には、はるかに簡潔で慣用的な方法でこれを行うことができます。
// 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 {...}
プロセスをカプセル化することもできます。
これは、元の質問の望ましい範囲を超えている可能性が最も高いです。
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)
いくつかの良い例を次に示します。
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))