dsfg3241 2014-12-23 18:04
浏览 120
已采纳

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()
        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条回答 默认 最新

  • drh96824 2014-12-23 18:22
    关注

    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>
    ", 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
    ", hash.Sum(nil))
    }
    

    Testing it out, I get:

    $ touch test.txt
    $ go run sha.go test.txt
    da39a3ee5e6b4b0d3255bfef95601890afd80709
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥50 易语言把MYSQL数据库中的数据添加至组合框
  • ¥20 求数据集和代码#有偿答复
  • ¥15 关于下拉菜单选项关联的问题
  • ¥20 java-OJ-健康体检
  • ¥15 rs485的上拉下拉,不会对a-b<-200mv有影响吗,就是接受时,对判断逻辑0有影响吗
  • ¥15 使用phpstudy在云服务器上搭建个人网站
  • ¥15 应该如何判断含间隙的曲柄摇杆机构,轴与轴承是否发生了碰撞?
  • ¥15 vue3+express部署到nginx
  • ¥20 搭建pt1000三线制高精度测温电路
  • ¥15 使用Jdk8自带的算法,和Jdk11自带的加密结果会一样吗,不一样的话有什么解决方案,Jdk不能升级的情况