dsfg3241
dsfg3241
2014-12-23 18:04

crypto / sha1不匹配openssl命令

已采纳

I'm trying to compute sha1, but the sha1 is not matching with the openssl command.

I compute the hash for an empty file like so on my Macbook :

$ touch test.txt
$ openssl sha1 -hex test.txt
SHA1(test.txt)= da39a3ee5e6b4b0d3255bfef95601890afd80709

And here is the simple test code I have :

package main

import "fmt"
import "crypto/sha1"

func main() {
        hash := sha1.New()
        hash.Write([]byte{0x00})
        fmt.Printf("Hash got %x, expected da39a3ee5e6b4b0d3255bfef95601890afd80709", hash.Sum(nil))
}

Here is the output as you see the output does not match, anyone know what I'm doing wrong?

Hash got 5ba93c9db0cff93f52b521d7420e43f6eda2784f, expected da39a3ee5e6b4b0d3255bfef95601890afd80709
  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

1条回答

  • drh96824 drh96824 7年前

    Your Go code is computing the SHA of an input of length 1, with a value of [ 0 ].

    The touch command actually creates an empty file (zero length), so the equivalent Go code would be:

    hash := sha1.New()
    // hash.Write([]byte{}) 
    data := hash.Sum(nil)
    fmt.Printf("hash: %x", data)
    

    The (commented) Write call above is a no-op. Playground

    Your test code does not actually seem to read from a file. Anyway, per your request, here is what a full sha utility would look like in Go:

    package main
    
    import (
            "crypto/sha1"
            "fmt"
            "io"
            "log"
            "os"
    )
    
    func main() {
            if len(os.Args) < 2 {
                    fmt.Printf("usage: %s <file>
    ", os.Args[0])
                    os.Exit(1)
            }
    
            file := os.Args[1]
    
            f, err := os.Open(file)
    
            if err != nil {
                    log.Fatal(err)
            }
    
            defer f.Close()
    
            hash := sha1.New()
    
            _, err = io.Copy(hash, f)
    
            if err != nil {
                    log.Fatal(err)
            }
    
            fmt.Printf("%x
    ", hash.Sum(nil))
    }
    

    Testing it out, I get:

    $ touch test.txt
    $ go run sha.go test.txt
    da39a3ee5e6b4b0d3255bfef95601890afd80709
    
    点赞 评论 复制链接分享