2013-04-08 23 views
6

Tôi cần tiện ích cho Windows mà tính toán checksum file sha256 để khi tôi tải fedora tôi có thể xác minh checksum từ đây: https://fedoraproject.org/static/checksums/Fedora-18-i386-CHECKSUMLàm thế nào để tính toán checksum file sha256 tại Gò

Microsoft tiện ích từ http://support.microsoft.com/kb/889768 không chỉ md5 và sha1.

Tôi không muốn sử dụng các công cụ có thể tải xuống khác không được ký và không có sẵn từ https hoặc từ các nguồn mà tôi không biết, vì không có ý nghĩa gì khi tải xuống mã chưa ký trên kết nối không được mã hóa hoặc từ không đáng tin cậy nguồn để xác minh chữ ký của mã khác để tin tưởng nó.

May mắn là google cung cấp khả năng sử dụng https cho tất cả các tải xuống để tôi có thể tải xuống Chuyển qua kết nối an toàn và bắt đầu từ đó.

Đây là mã đơn giản thực hiện điều đó đối với một tệp nhỏ, nhưng nó không phải là rất tốt cho các tệp lớn vì nó không phát trực tuyến.

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

Cách sử dụng các luồng để hoạt động trên mọi kích thước tệp.

Trả lời

18

Máy chia SHA256 thực hiện giao diện io.Writer, do đó, một tùy chọn sẽ là sử dụng chức năng io.Copy() để sao chép dữ liệu từ một khối thích hợp io.Reader trong khối. Một cái gì đó như thế này nên làm:

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

Full ví dụ về 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 không bỏ qua hàng đầu 0 byte, vì vậy fmt.Println(hex.EncodeToString([]byte{0x00, 0x00, 0xA, 0xB, 0xC})) cho 00000a0b0c

1

Các crypto/sha256 godoc thực sự có một snippet rằng chương trình làm thế nào để làm điều đó (về cơ bản nó giống như mã của 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)) 
} 
Các vấn đề liên quan