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()
        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
  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答


  • 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 (
    func main() {
            if len(os.Args) < 2 {
                    fmt.Printf("usage: %s <file>
    ", os.Args[0])
            file := os.Args[1]
            f, err := os.Open(file)
            if err != nil {
            defer f.Close()
            hash := sha1.New()
            _, err = io.Copy(hash, f)
            if err != nil {
    ", hash.Sum(nil))

    Testing it out, I get:

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