5 Go 密码学(二)哈希

一、哈希概述

Hash,音译“哈希”,翻译“散列”。哈希计算就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。这种操作有点类似于数据的“指纹”,任何数据哪怕修改一个Bit也是会产生不同散列值的,这就让消息传输的安全校验有了实现的方法。

哈希计算的特点是:

  • 从源数据计算出哈希值容易,其生成快速,算力代价较小;
  • 而从哈希值反推出源数据几乎不可能,即使可能也要付出高昂的算力成本;
  • 哈希算法有可能产生碰撞。所谓“碰撞”,即两个不同的源数据根据同一种哈希算法生成同样的值。一般产生碰撞的概率非常小,这也检验哈希算法的优秀程度。

开发一套高安全性的哈希算法非常困难,业界里一般使用公开的被认证的哈希算法,如md5,sha1,sha256,sha512等,目前md5、sha1已被破解,但还是需要一定代价的,所以现在还在沿用,如果对安全性要求较高,建议使用sha256以上的哈希算法,但对于一些非外部传输的内部校验,还是可以使用md5的,毕竟正向算力成本低。

二、Go 使用哈希加密

Go标准库提供生成消息摘要(指纹)的哈希算法包:

  • crypto/md5:实现了MD5哈希算法
  • crypto/sha1:实现了SHA1哈希算法
  • crypto/sha256:实现了SHA224和SHA256哈希算法
  • crypto/sha512:实现了SHA384和SHA512哈希算法

下面我们来演示一下使用示例:

//基本的md5哈希运算
func BaseHash() {
    src := "go func chan"

    //md5计算
    md5 := md5.New()
    md5Bytes := md5.Sum([]byte(src))
    md5String := hex.EncodeToString(md5Bytes)
    fmt.Println("MD5 HASH:", md5String)

    //sha224
    sha224Bytes := sha256.Sum224([]byte(src))
    sha224String := hex.EncodeToString(sha224Bytes[:])
    fmt.Println("SHA224 HASH:", sha224String)

    //sha256
    sha256Bytes := sha256.Sum256([]byte(src))
    sha256String := hex.EncodeToString(sha256Bytes[:])
    fmt.Println("SHA256 HASH:", sha256String)

    //sha384
    sha384Bytes := sha512.Sum384([]byte(src))
    sha384String := hex.EncodeToString(sha384Bytes[:])
    fmt.Println("SHA384 HASH:", sha384String)

    //sha512
    sha512Bytes := sha512.Sum512([]byte(src))
    sha512String := hex.EncodeToString(sha512Bytes[:])
    fmt.Println("SHA512 HASH:", sha512String)

    //OUTPUT:十六进制字符输出
    //MD5 HASH: 676f2066756e63206368616ed41d8cd98f00b204e9800998ecf8427e
    //SHA224 HASH: 5c6ce52ae98e2b27d9aac4d5e4d7b48dfe25fcc11e3f61a8afbeb5ef
    //SHA256 HASH: 69ffe43189a4bc21eca8d70d74786366dd3afcb4a74cdd9c909bf15b538ecac6
    //SHA384 HASH: 4692aa44548c74a5225ce399030039b7c7b5bd963f9c884d5a4810006ab4e3175bc88f27fe3377afab91140ecbd32de8
    //SHA512 HASH: e4c52638805b941dce1d045c5211b307a7486c5e0110c1efe6f627a1b3e7a296d4c5558c10bd015f71c00483770afebc600962cd329aa1565a68231a824cab6c

}

对上述哈希计算分别进行压测得到性能结果的比较:

goos: darwin
goarch: amd64
pkg: cryptography/myHASH
BenchmarkMd5-4           2000000           611 ns/op        1280 B/op          5 allocs/op
--- BENCH: BenchmarkMd5-4
    HashBenchmark_test.go:9: 开始基准测试MD5!!!!
...
BenchmarkSha224-4        2000000           674 ns/op         288 B/op          3 allocs/op
--- BENCH: BenchmarkSha224-4
    HashBenchmark_test.go:19: 开始基准测试Sha224!!!!
...
BenchmarkSha256-4        2000000           676 ns/op         288 B/op          3 allocs/op
--- BENCH: BenchmarkSha256-4
    HashBenchmark_test.go:29: 开始基准测试Sha256!!!!
 ...
BenchmarkSha384-4        2000000           683 ns/op         352 B/op          3 allocs/op
--- BENCH: BenchmarkSha384-4
    HashBenchmark_test.go:39: 开始基准测试Sha384!!!!
...
BenchmarkSha512-4        2000000           721 ns/op         416 B/op          3 allocs/op
--- BENCH: BenchmarkSha512-4
    HashBenchmark_test.go:49: 开始基准测试Sha512!!!!
...
PASS
ok      cryptography/myHASH 10.184s

由上可见其:

性能 : md5>sha224>sha256>sha384>sha512

内存消耗:md5>sha512>sha384>sha256=sha224

相较取舍后,建议平常使用sha256即可,安全性可靠且消耗资源不高。

除了对单个字符串进行哈希,也可分多次添加字符串哈希,下面简单示例:


//多输入源的哈希运算
func MultiSha256(srcs ...string) string {
    hash := sha256.New()

    //往哈希运算器里添加数据
    for _, v := range srcs {
        io.WriteString(hash, v)
    }

    //一般这种方式的参数为nil,因为很少有拼接b哈希运算的情况
    bytes := hash.Sum(nil)
    //十六进制字符串转换输出
    hashString := hex.EncodeToString(bytes)

    return hashString
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,204评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,091评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,548评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,657评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,689评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,554评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,302评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,216评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,661评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,851评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,977评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,697评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,306评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,898评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,019评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,138评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,927评论 2 355

推荐阅读更多精彩内容