使用golang生成字符串的SHA哈希

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用golang生成字符串的SHA哈希相关的知识,希望对你有一定的参考价值。

有人能告诉我一个如何生成我所拥有的字符串的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函数返回的原始字节数组。

下面的评论似乎有点混乱。因此,让我们向下一位用户阐明转换为字符串的最佳做法:

  • 您永远不会将SHA作为字符串存储在数据库中,而是作为原始字节存储
  • 当你想向用户显示SHA时,常见的方法是Hexadecimal
  • 当你想要一个字符串表示,因为它必须适合URL或文件名时,通常的解决方案是Base64,它更紧凑
另一答案

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щфша540010фяцц15дд1806年2月8日10周前бдбд

另一答案

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

你可以run this example on 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)

在包含login_password字段的http.Request POST的这个简单示例中,值得注意的是fmt.Sprintf()使用%x调用将哈希值转换为十六进制而不必包含import "encoding/hex"声明。

(我们使用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()
}

对于Golang的标准加密集中的Sha库变体,例如Sha512,这是正确的(至少在发布时)。

最后,如果有人想,他们可以跟随Golang的[to] String()实现,使用func (h hash.Hash) String() string {...}来封装进程。

这很可能超出了原始问题的预期范围。

另一答案

这是一些很好的例子:

第二个示例以sha256为目标,执行sha1十六进制:

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

另一答案
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
", sha)
fmt.Println(shaStr)

另一答案

这是一个可用于生成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

你会发现FNV32FNV32aFNV64FNV65aMD5SHA1SHA256SHA512

另一答案
// 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
", bs))
    return sh
}

以上是关于使用golang生成字符串的SHA哈希的主要内容,如果未能解决你的问题,请参考以下文章

golang 使用HMAC SHA256创建base64哈希的示例

如何在Java中使用SHA384生成48个字符的哈希

在python中使用字符串+密钥计算SHA哈希

如何在Mason代码中创建字符串的SHA-256哈希?

使用 Crypto++ 使用 SHA1 生成随机哈希

试图编译生成 sha1 哈希的程序