sha加密算法与MD5算法一样也是hash算法的一种,go提供了sha算法的几种,sha1,sha256,sha512,本章节一起讲解它们的使用方法
s1 := sha1.New() // 新建一个sha1哈希算法
s1.Write([]byte("abc123")) // 写入数据
fmt.Printf("%x\n",s1.Sum(nil)) // 打印:6367c48dd193d56ea7b0baad25b19455e529f5ee
// 简化用法
fmt.Printf("%x\n",sha1.Sum([]byte("abc123"))) // 打印;6367c48dd193d56ea7b0baad25b19455e529f5ee
s256 := sha256.New() // 新建一个sha256哈希算法
s256.Write([]byte("abc123")) // 写入数据
fmt.Printf("%x\n",s256.Sum(nil)) // 打印:6ca13d52ca70c883e0f0bb101e425a89e8624de51db2d2392593af6a84118090
// 简化用法
fmt.Printf("%x\n",sha256.Sum256([]byte("abc123"))) // 打印:6ca13d52ca70c883e0f0bb101e425a89e8624de51db2d2392593af6a84118090
// sha256包还提供了sha224哈希算法,这也是sha算法家族的一种,最终产生56位的十六进制hash
s224 := sha256.New224()
s224.Write([]byte("abc123"))
fmt.Printf("%x\n",s224.Sum(nil)) // 打印:5c69bb695cc29b93d655e1a4bb5656cda624080d686f74477ea09349
// 简化用法
fmt.Printf("%x\n",sha256.Sum224([]byte("abc123"))) // 打印:5c69bb695cc29b93d655e1a4bb5656cda624080d686f74477ea09349
s512 := sha512.New() // sha512
s512.Write([]byte("abc123")) // 写入数据
fmt.Printf("%x\n",s512.Sum(nil))
// 打印:c70b5dd9ebfb6f51d09d4132b7170c9d20750a7852f00680f65658f0310e810056e6763c34c9a00b0e940076f54495c169fc2302cceb312039271c43469507dc
// 简化用法
fmt.Printf("%x\n",sha512.Sum512([]byte("abc123")))
// 打印:c70b5dd9ebfb6f51d09d4132b7170c9d20750a7852f00680f65658f0310e810056e6763c34c9a00b0e940076f54495c169fc2302cceb312039271c43469507dc
// sha512包还提供了sha384哈希算法,这也是sha算法家族的一种,最终产生96位的十六进制hash
s384 := sha512.New384()
s384.Write([]byte("abc123"))
fmt.Printf("%x\n",s384.Sum(nil))
// 打印:a31d79891919cad24f3264479d76884f581bee32e86778373db3a124de975dd86a40fc7f399b331133b281ab4b11a6ca
// 简化用法
fmt.Printf("%x\n",sha512.Sum384([]byte("abc123")))
// 打印:a31d79891919cad24f3264479d76884f581bee32e86778373db3a124de975dd86a40fc7f399b331133b281ab4b11a6ca
sha家族的算法,无论是sha256还是sha512都是产生更长的hash值,尽可能的减小hash碰撞的可能性,但无论多长的hash值,攻击者都可以对应这个算法,用生成彩虹表的方式来破解你加密前的值,所以要让彩虹表这种固定hash查询的方式无效,那需要往加密前的数据里面加盐,本文不详细讲解加盐,网上可以找到很多资料,这里就不再重复多说。