英文:
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("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>\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))
}
Testing it out, I get:
$ touch test.txt
$ go run sha.go test.txt
da39a3ee5e6b4b0d3255bfef95601890afd80709
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论