crypto/sha1与openssl命令不匹配

huangapple go评论83阅读模式
英文:

crypto/sha1 not matching openssl command

问题

我正在尝试计算SHA1哈希值,但是SHA1哈希值与openssl命令不匹配。

我在我的Macbook上对一个空文件进行如下计算:

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

这里是我拥有的简单测试代码:

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

如你所见,输出结果不匹配,有人知道我做错了什么吗?

Hash got 5ba93c9db0cff93f52b521d7420e43f6eda2784f, expected da39a3ee5e6b4b0d3255bfef95601890afd80709
英文:

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

得分: 6

你的Go代码正在计算长度为1的输入的SHA,值为[ 0 ]

touch命令实际上创建一个空文件(长度为零),因此等效的Go代码如下:

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

上面被注释的Write调用是一个空操作。Playground

你的测试代码似乎并没有从文件中读取。无论如何,根据你的要求,下面是一个完整的Go中SHA实用程序的示例:

package main

import (
	"crypto/sha1"
	"fmt"
	"io"
	"log"
	"os"
)

func main() {
	if len(os.Args) < 2 {
		fmt.Printf("usage: %s <file>\n", 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\n", hash.Sum(nil))
}

测试一下,我得到的结果是:

$ touch test.txt
$ go run sha.go test.txt
da39a3ee5e6b4b0d3255bfef95601890afd80709
英文:

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(&quot;hash: %x&quot;, 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 (
        &quot;crypto/sha1&quot;
        &quot;fmt&quot;
        &quot;io&quot;
        &quot;log&quot;
        &quot;os&quot;
)

func main() {
        if len(os.Args) &lt; 2 {
                fmt.Printf(&quot;usage: %s &lt;file&gt;\n&quot;, 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(&quot;%x\n&quot;, hash.Sum(nil))
}

Testing it out, I get:

$ touch test.txt
$ go run sha.go test.txt
da39a3ee5e6b4b0d3255bfef95601890afd80709

huangapple
  • 本文由 发表于 2014年12月24日 02:04:13
  • 转载请务必保留本文链接:https://go.coder-hub.com/27625705.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定