设为首页 收藏本站
查看: 1449|回复: 0

[经验分享] golang中的检验hash

[复制链接]

尚未签到

发表于 2018-9-20 06:08:05 | 显示全部楼层 |阅读模式
  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\n", 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\n",md5h.Sum(nil), flag.Arg(0))
  
}
  
if *sha1f {
  
sha1h := sha1.New()
  
io.Copy(sha1h,infile)
  
fmt.Printf("%x  %s\n",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 = 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)
  
}
  
}
  

  
dest := io.MultiWriter(writers...)
  

  
io.Copy(dest, infile)
  

  
for i, flag := range flags {
  
if *flag {
  
fmt.Printf("%s: \n%x\n", algos, impls.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  

  
#
  




运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-596613-1-1.html 上篇帖子: 【GoLang】golang底层数据类型实现原理 下篇帖子: golang路上的小学生系列
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表