2014-12-23 74 views
1

我正在尝试计算sha1,但是sha1与openssl命令不匹配。crypto/sha1不匹配openssl命令

我计算了一个空文件哈希像这样我的MacBook:

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

而且here是一个简单的测试代码,我有:

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 
+0

在哪一点你喂'test.txt'内容到sha1?你不计算0字节的sha1吗? –

+1

对不起 - 你说test.txt是空的。但空单元可能与单字节0内容不同。 –

回答

5

你Go代码被计算SHA长度1的输入的,具有[ 0 ]的值。

touch命令实际创建一个空文件(零长度),所以等效Go代码将是:

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

的(评论)收件拨打以上是无操作。 Playground

您的测试代码实际上并不是从文件中读取的。总之,按照您的要求,这里是一个完整的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 
+0

是的,这似乎适用于0长度输入。在我的代码中,我实际上是从文件中读取并直接写入散列并且它不匹配。你能提供一个与openssl命令相匹配的文件读取的例子吗? –

+0

感谢你的例子,我的问题源于另一个包。 –