web-dev-qa-db-ja.com

Goでsha256ファイルのチェックサムを計算する方法

Fedoraをダウンロードするときにここからチェックサムを確認できるように、sha256ファイルのチェックサムを計算するWindows用のユーティリティが必要です: https://fedoraproject.org/static/checksums/Fedora-18-i386-CHECKSUM

http://support.Microsoft.com/kb/889768 のMicrosoftユーティリティは、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)))
}

ストリームを使用して、任意のファイルサイズで機能するようにする方法。

14
alpav

SHA256ハッシャーは_io.Writer_インターフェースを実装しているため、1つのオプションは、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)
}
_
25

crypto/sha256 godoc には実際には スニペット があり、その方法を示しています(基本的には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))
}
10
Melvin

Md5sumの完全な例:

_func md5sum(filePath string) (result string, err error) {
    file, err := os.Open(filePath)
    if err != nil {
        return
    }
    defer file.Close()

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

    result = hex.EncodeToString(hash.Sum(nil))
    return
}
_

EncodeToStringは先頭の0バイトを省略しないため、fmt.Println(hex.EncodeToString([]byte{0x00, 0x00, 0xA, 0xB, 0xC}))は_00000a0b0c_を返します

0
Oleg Neumyvakin