首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Go中计算sha256文件校验和

如何在Go中计算sha256文件校验和
EN

Stack Overflow用户
提问于 2013-04-08 20:34:21
回答 3查看 32.5K关注 0票数 23

我需要计算sha256文件校验和的Windows实用程序,以便当我下载fedora时,我可以从以下位置验证校验和:https://fedoraproject.org/static/checksums/Fedora-18-i386-CHECKSUM

来自http://support.microsoft.com/kb/889768的微软实用程序只做md5和sha1。

我不想使用其他未签名的可下载工具,这些工具不能从https或我不知道的来源获得,因为通过未加密的连接或从不可信的来源下载未签名的代码来验证另一个代码的签名以使其可信是没有任何意义的。

幸运的是,谷歌提供了使用https进行所有下载的可能性,这样我就可以通过安全连接进行下载,并从那里开始。

下面是对小文件执行此操作的简单代码,但它对大文件不是很好,因为它不是流。

代码语言:javascript
复制
package main

import (
    "io/ioutil"
    "crypto/sha256"
    "os"
    "log"
    "encoding/hex"
)

func main() {
    hasher := sha256.New()
    s, err := ioutil.ReadFile(os.Args[1])    
    hasher.Write(s)
    if err != nil {
        log.Fatal(err)
    }

    os.Stdout.WriteString(hex.EncodeToString(hasher.Sum(nil)))
}

如何让它使用streams,这样它可以在任何文件大小上工作。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-04-09 11:20:19

SHA256散列器实现io.Writer接口,因此一种选择是使用io.Copy()函数以块为单位从适当的io.Reader复制数据。类似这样的代码应该可以:

代码语言:javascript
复制
f, err := os.Open(os.Args[1])
if err != nil {
    log.Fatal(err)
}
defer f.Close()
if _, err := io.Copy(hasher, f); err != nil {
    log.Fatal(err)
}
票数 28
EN

Stack Overflow用户

发布于 2017-07-16 08:48:17

crypto/sha256 godoc实际上有一个snippet,它展示了如何做到这一点(它基本上与James的代码相同):

代码语言:javascript
复制
package main

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

func main() {
  f, err := os.Open("file.txt")
  if err != nil {
    log.Fatal(err)
  }
  defer f.Close()

  h := sha256.New()
  if _, err := io.Copy(h, f); err != nil {
    log.Fatal(err)
  }

  fmt.Printf("%x", h.Sum(nil))
}
票数 24
EN

Stack Overflow用户

发布于 2016-11-05 17:12:45

完整的md5sum示例:

代码语言:javascript
复制
func md5sum(filePath string) (string, error) {
    file, err := os.Open(filePath)
    if err != nil {
        return "", err
    }
    defer file.Close()

    hash := md5.New()
    if _, err := io.Copy(hash, file); err != nil {
        return "", err
    }
    return hex.EncodeToString(hash.Sum(nil)), nil
}

EncodeToString不省略前导0字节,因此fmt.Println(hex.EncodeToString([]byte{0x00, 0x00, 0xA, 0xB, 0xC}))提供00000a0b0c

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15879136

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档