2014-12-23 3 views
1

sha1을 계산하려고하는데 sha1이 openssl 명령과 일치하지 않습니다.crypto/sha1이 openssl 명령과 일치하지 않습니다.

나는 나의 맥북에 같은 빈 파일의 해시를 계산 : 당신은 참조로 여기

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

이 출력됩니다 :

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

그리고 here 내가 가지고있는 간단한 테스트 코드 출력이 일치하지 않는 경우 누구나 내가 뭘 잘못하고 있는지 알 수 있습니까?

Hash got 5ba93c9db0cff93f52b521d7420e43f6eda2784f, expected da39a3ee5e6b4b0d3255bfef95601890afd80709 
+0

당신이 먹이 않는'test.txt' 콘텐츠를 sha1로 보내시겠습니까? 0 바이트의 sha1을 계산하지 않습니까? –

+1

죄송합니다 - test.txt가 비어 있다고하셨습니다. 그러나 비어있는 것은 아마도 싱글 바이트 0 콘텐츠와 다릅니다. –

답변

5

내 이동 [ 0 ] 코드의 값으로, 길이 (1)의 입력의 SHA를 계산한다.

touch 명령은 실제로 빈 파일 (제로 길이)를 작성하므로 해당하는 이동 코드는 다음과 같습니다

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

(주석) 위의 전화를 작성하는 조작은 행해지 지 않습니다. Playground

테스트 코드가 실제로 파일에서 읽히지 않는 것 같습니다. 어쨌든, 귀하의 요청에 따라, 여기에 전체 샤 유틸리티는 이동처럼 보일 것이다 것입니다 :

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 길이 input.In 내 코드에서 실제로 파일에서 읽고 해시에 직접 쓰고 그것은 일치하지 않는 것 같습니다. openssl 명령과 일치하는 파일에서 읽는 예제를 제공 할 수 있습니까? –

+0

예를 들어 주셔서 감사합니다. 문제는 다른 패키지에서 발생했습니다. –