我需要计算sha256文件校验和的Windows实用程序,以便当我下载fedora时,我可以从以下位置验证校验和:https://fedoraproject.org/static/checksums/Fedora-18-i386-CHECKSUM
来自http://support.microsoft.com/kb/889768的微软实用程序只做md5和sha1。
我不想使用其他未签名的可下载工具,这些工具不能从https或我不知道的来源获得,因为通过未加密的连接或从不可信的来源下载未签名的代码来验证另一个代码的签名以使其可信是没有任何意义的。
幸运的是,谷歌提供了使用https进行所有下载的可能性,这样我就可以通过安全连接进行下载,并从那里开始。
下面是对小文件执行此操作的简单代码,但它对大文件不是很好,因为它不是流。
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,这样它可以在任何文件大小上工作。
发布于 2013-04-09 11:20:19
SHA256散列器实现io.Writer接口,因此一种选择是使用io.Copy()函数以块为单位从适当的io.Reader复制数据。类似这样的代码应该可以:
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)
}发布于 2017-07-16 08:48:17
crypto/sha256 godoc实际上有一个snippet,它展示了如何做到这一点(它基本上与James的代码相同):
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))
}发布于 2016-11-05 17:12:45
完整的md5sum示例:
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
https://stackoverflow.com/questions/15879136
复制相似问题