Generating the SHA hash of a string using golang

后端 未结 8 1542
清酒与你
清酒与你 2020-12-23 16:29

Can someone show me a working example of how to generate a SHA hash of a string that I have, say myPassword := \"beautiful\" , using Go 1 ?

The docs pa

相关标签:
8条回答
  • 2020-12-23 16:33

    You can actually do this in a much more concise and idiomatic manner:

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

    In this trivial example of a http.Request POST containing a login_password field, it is worth noting that fmt.Sprintf() called with %x converted the hash value to hex without having to include an import "encoding/hex" declaration.

    ( We used fmt.Sprintf() as opposed to fmt.Printf() as we were outputting a string to a variable assignment, not an io.Writer interface. )

    Also of reference, is that the sha1.Sum() function verbosely instantiates in the same manner as the sha1.New() definition:

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

    This holds true ( at least at the time of posting ) for the Sha library variants in Golang's standard crypto set, such as Sha512.

    Lastly, if one wanted to, they could follow Golang's [to]String() implementation with something like func (h hash.Hash) String() string {...} to encapsulate the process.

    That is most likely beyond the desired scope of the original question.

    0 讨论(0)
  • 2020-12-23 16:37

    An example :

    import (
        "crypto/sha1"
        "encoding/base64"
    )
    
    func (ms *MapServer) storee(bv []byte) {
        hasher := sha1.New()
        hasher.Write(bv)
        sha := base64.URLEncoding.EncodeToString(hasher.Sum(nil))
            ...
    }
    

    In this example I make a sha from a byte array. You can get the byte array using

    bv := []byte(myPassword) 
    

    Of course you don't need to encode it in base64 if you don't have to : you may use the raw byte array returned by the Sum function.

    There seems to be some little confusion in comments below. So let's clarify for next users the best practices on conversions to strings:

    • you never store a SHA as a string in a database, but as raw bytes
    • when you want to display a SHA to a user, a common way is Hexadecimal
    • when you want a string representation because it must fit in an URL or in a filename, the usual solution is Base64, which is more compact
    0 讨论(0)
  • 2020-12-23 16:39

    Here is a function you could use to generate a SHA1 hash:

    // SHA1 hashes using sha1 algorithm
    func SHA1(text string) string {
        algorithm := sha1.New()
        algorithm.Write([]byte(text))
        return hex.EncodeToString(algorithm.Sum(nil))
    }
    

    I put together a group of those utility hash functions here: https://github.com/shomali11/util

    You will find FNV32, FNV32a, FNV64, FNV65a, MD5, SHA1, SHA256 and SHA512

    0 讨论(0)
  • 2020-12-23 16:39
    // 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 讨论(0)
  • 2020-12-23 16:42

    Go By Example has a page on sha1 hashing.

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

    You can run this example on play.golang.org

    0 讨论(0)
  • 2020-12-23 16:50

    Here's some good examples:

    • http://golang.org/src/pkg/crypto/hmac/hmac_test.go
    • http://www.jokecamp.com/blog/examples-of-creating-base64-hashes-using-hmac-sha256-in-different-languages/#go

    The second example targets sha256, to do sha1 hexadecimal you'd do:

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

    (from https://github.com/soniah/dnsmadeeasy)

    0 讨论(0)
提交回复
热议问题