zoukankan      html  css  js  c++  java
  • golang中的检验hash

    1.对字符串进行hash

    大家可以看一下, SHA1 Hashes

    Go by Example写道:

    The pattern for generating a hash is sha1.New(), sha1.Write(bytes), then sha1.Sum([]byte{}). 

    附上golang代码

    package main
    
    import (
            "crypto/sha1"
            "fmt"
    )
    
    
    func main() {
            s := "sha1 this string"
    
            h := sha1.New()
    
            h.Write([]byte(s))
    
            bs := h.Sum(nil)
    
            fmt.Println(s)
            fmt.Printf("%x
    ", bs)
    
    }

    结果输出为:

    sha1 this string
    cf23df2207d99a74fbe169e3eba035e633b65d94

    而在godoc产生的文档使用io:WriteString代替sha1.Write(),测试2种方法都可以用。

    有些文档说,使用io:WriteString,意思更加明显,而且不用像上面要进行类型转换。

    h := sha1.New()
    io.WriteString(h, "His money is twice tainted: 'taint yours and 'taint mine.")
    fmt.Printf("% x", h.Sum(nil))

    说个有趣的现象,使用上面代码产生的hash值和命令行中sha1sum的值不一致。

    $echo "sha1 this string" | sha1sum
    0faabfb58d5c522f47944173f2953f40ecfc2975  -
    $
    $cat a.txt 
    sha1 this string
    $sha1sum a.txt
    0faabfb58d5c522f47944173f2953f40ecfc2975  a.txt
    $

    可以看到,上面2个结果是一致的,但与我们上面golang代码的输出不一致。

    原因是,命令行echo会在字符串后面添加一个换行符,导致整个hash值变化。大家可以自行在golang的代码中,在验证的字符串中添加换行符测试看看。

    2.对文本进行hash

    参考 google论坛

    模式是,os.Open(file), io.Copy(dst,src), sha1.Sum()

    摘录2个github代码,代码在原来的基础上有修改。

    go md5/sha1 example

    /*
    Hash - Guillermo Estrada
    
    Simple utility to obtain the MD5 and/or SHA-1 
    of a file from the command line.
    
    package main
    
    import (
            "io"
            "os"
            "fmt"
            "flag"
            "crypto/md5"
            "crypto/sha1"
    )
    
    func main() {
    
            md5f := flag.Bool("md5", false, "-md5 calculate md5 hash of file")
            sha1f := flag.Bool("sha1", false, "-sha1 calculate sha1 hash of file")
            flag.Parse()
    
            if !*md5f && !*sha1f {
                    fmt.Println("err: No hash specified. Use -md5 or -sha1 or both.")
                    os.Exit(1)
            }
    
    
    
            infile, inerr := os.Open(flag.Arg(0))
            if inerr == nil {
                    if *md5f {  
                            md5h := md5.New()
                            io.Copy(md5h,infile)
                            fmt.Printf("%x  %s
    ",md5h.Sum(nil), flag.Arg(0))
                    }
                    if *sha1f {  
                            sha1h := sha1.New()
                            io.Copy(sha1h,infile)
                            fmt.Printf("%x  %s
    ",sha1h.Sum(nil), flag.Arg(0))
                    }
    
            } else {
                    fmt.Println(inerr)
                    os.Exit(1)
            }
    }

    命令行调用:

    #for a in md5 sha1 ; do echo ${a}sum; ./hash -$a /bin/ls; ${a}sum /bin/ls; echo; done
    md5sum
    b691e28e120f6989e37c7db21cb51931  /bin/ls
    b691e28e120f6989e37c7db21cb51931  /bin/ls
    
    sha1sum
    502202e177bb8677c8c3b059cc1401d1524806c8  /bin/ls
    502202e177bb8677c8c3b059cc1401d1524806c8  /bin/ls
    
    #

    hashes.go

    /*
    Hash - Guillermo Estrada
    
    Simple utility to obtain the MD5 and/or SHA-1 
    of a file from the command line.
    
    2011
    
    Edited: Marko Mikulicic 2011
    */
    
    package main
    
    import (
            "io"
            "os"
            "fmt"
            "flag"
            "hash"
            "crypto/md5"
            "crypto/sha1"
            "crypto/sha256"
            "crypto/sha512"
            //"crypto/ripemd160"
    )
    
    func main() {
    
            algos := [...]string{"md5", "sha1", "sha256", "sha512" }
            impls := [...]hash.Hash{md5.New(), sha1.New(), sha256.New(), sha512.New() }
            flags := make([]*bool, len(algos))
            for i, a := range algos {
                    flags[i] = flag.Bool(a, false, fmt.Sprintf("-%s calculate %s hash of file", a, a))
            }
    
            flag.Parse()
    
    
            any := false
            for _, f := range flags {
                    any = any || *f
            }
            if any == false {
                    fmt.Println("err: No hash specified. Please run with --help to see list of supported hash algos")
                    os.Exit(1)
            }
    
    
            infile, err := os.Open(flag.Arg(0))
            if err != nil {
                    fmt.Println(err)
                    os.Exit(1)
            }
    
    
            writers := make([]io.Writer, 0, len(impls))
            for i, flag := range flags {
                    if *flag {
                            writers = append(writers, impls[i])
                    }
            }
    
            dest := io.MultiWriter(writers...)
    
            io.Copy(dest, infile)
    
            for i, flag := range flags {
                    if *flag {
                            fmt.Printf("%s: 
    %x
    ", algos[i], impls[i].Sum(nil))
                    }
            }
    
    }

    命令行调用:

    #for a in md5 sha1 sha256 sha512 ; do ./hashes -$a /bin/ls; ${a}sum /bin/ls; echo; done
    md5: 
    b691e28e120f6989e37c7db21cb51931
    b691e28e120f6989e37c7db21cb51931  /bin/ls
    
    sha1: 
    502202e177bb8677c8c3b059cc1401d1524806c8
    502202e177bb8677c8c3b059cc1401d1524806c8  /bin/ls
    
    sha256: 
    1e87d99599ddea2a93f060b50a54066e8b756d752158e6147cbb99b06eb11d99
    1e87d99599ddea2a93f060b50a54066e8b756d752158e6147cbb99b06eb11d99  /bin/ls
    
    sha512: 
    343b38486ad17c5813026c9df7e1ce7e268d7c64e70439aebddcafdfe10a0dfc9f55bf8169c3e592942f50bb408a852dfd1fb08e0bcadf214bc89dbf72d693f8
    343b38486ad17c5813026c9df7e1ce7e268d7c64e70439aebddcafdfe10a0dfc9f55bf8169c3e592942f50bb408a852dfd1fb08e0bcadf214bc89dbf72d693f8  /bin/ls
    
    #
  • 相关阅读:
    linux下一步一步安装禅道项目管理工具
    tfw格式图解
    yaourt: a pacman frontend(pacman前端,翻译)
    OpenGL官方教程——着色器语言概述
    [翻译]opengl扩展教程2
    [翻译]opengl扩展教程1
    Git-it字典翻译
    解决 QtCreator 3.5(4.0)无法输入中文的问题
    Valgrind 3.11.0编译安装
    ubuntu linux 下wine的使用
  • 原文地址:https://www.cnblogs.com/getong/p/3791230.html
Copyright © 2011-2022 走看看