golang标准库-crypto/sha1,crypto/sha256,crypto/sha512(sha加密算法)

sha加密算法与MD5算法一样也是hash算法的一种,go提供了sha算法的几种,sha1,sha256,sha512,本章节一起讲解它们的使用方法
  • 先看sha1,sha1加密后的结果为20位字节大小,转化为十六进制,最终结果就是40位。sha1和md5一样属于出现比较早的hash算法,虽然要破解,产生hash碰撞的记录依然很小,但现在已经有反向查表发和彩虹表等一些方法可以很轻松逆向查到hash值对应的密文。现在基本不推荐使用
	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
  •  sha256算法是sha家族安全性较高的算法,因为它产生的hash值为64位十六进制,在sha1的基础上又大大降低了hash碰撞的可能性
	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
  •  sha512算法是比sha256安全性更高,因为它产生的hash值为128位十六进制
	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查询的方式无效,那需要往加密前的数据里面加盐,本文不详细讲解加盐,网上可以找到很多资料,这里就不再重复多说。

你可能感兴趣的:(golang标准库,go)