2013-04-08 9 views
6

muszę narzędzie dla Windows, który oblicza sha256 sumę kontrolną pliku tak, że kiedy mogę pobrać fedora mogę sprawdzić sumę kontrolną stąd: https://fedoraproject.org/static/checksums/Fedora-18-i386-CHECKSUMJak obliczyć SHA256 sumę kontrolną pliku Przejdź

Microsoft narzędzie od http://support.microsoft.com/kb/889768 robi tylko MD5 i SHA1.

Nie chcę używać innych narzędzi do pobrania, które nie są podpisane i niedostępne z https lub ze źródeł, o których nie wiem, ponieważ nie ma sensu pobieranie niepodpisanego kodu przez niezaszyfrowane połączenie lub niezaufane źródło, aby zweryfikować podpis innego kodu, aby mu zaufać.

Na szczęście Google oferuje możliwość korzystania z https dla wszystkich plików do pobrania, więc mogę pobrać Przejdź przez bezpieczne połączenie i zacznij od tego.

Oto prosty kod, który robi to dla małego pliku, ale nie jest zbyt dobry dla dużych plików, ponieważ nie jest przesyłany strumieniowo.

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

Jak uczynić go używać strumieni tak, że działa na dowolnym rozmiarze.

Odpowiedz

18

Spawarka SHA256 implementuje interfejs io.Writer, więc jedną z opcji byłoby użycie funkcji io.Copy() w celu skopiowania danych z odpowiednich io.Reader w blokach. Coś jak to powinno zrobić:

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

Pełny przykład 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 nie pomija wiodące 0 bajtów, więc fmt.Println(hex.EncodeToString([]byte{0x00, 0x00, 0xA, 0xB, 0xC})) daje 00000a0b0c

1

crypto/sha256 godoc faktycznie ma snippet który pokazuje jak to zrobić (jest to zasadniczo ten sam kod co 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)) 
} 
Powiązane problemy