golang实现MD5,SHA256,bcrypt加密


前言

加密算法肯定可以解密。MD5,SHA256,bcrypt算法都是不可逆不可解密的,所以不是加密算法,例如2+3得到5,但是5不知道是否由2+3得到,也可能1+4,0+5,所以不可逆。经常混淆的叫加密算法,但实质是散列算法。


一、MD5算法 目前已不够安全,可通过彩虹表很容易破解

代码如下(示例):

func MD5(password string) string {
	hash := MD5.New()
	hash.Write([]byte(password))
	res:=hex.EncodeToString(hash.Sum(nil))
	fmt.Println(len(res))
	return res
}
//MD5加盐加密 比不加盐安全性高,但是也不足够安全
func MD5(password string) string {
	const salt = "2021/10/21"//自定义加盐
	hash := MD5.New()
	hash.Write([]byte(password+salt))//密码与盐自定义组合
	res:=hex.EncodeToString(hash.Sum(nil))
	fmt.Println(len(res))
	return res
}

二、SHA256算法 相对MD5更加安全,当然SHA512长度更长更加安全,但性能需求更大

代码如下(示例):

func SHA256(password string) string {
	hash := sha256.New()
	hash.Write([]byte(password))
	res:=hex.EncodeToString(hash.Sum(nil))
	fmt.Println(len(res))
	return res
}
//加盐加密
func SHA256(password string) string {
	const salt = "2021/10/21"//自定义加盐
	hash := sha256.New()
	hash.Write([]byte(password+salt))//密码与盐自定义组合
	res:=hex.EncodeToString(hash.Sum(nil))
	fmt.Println(len(res))
	return res
}

三、bcrypt算法 破解的成本更高,更加安全,bcrypt算法包含了随机加盐,也更加方便

bcrypt安装包 go get golang.org/x/crypto/bcrypt
代码如下(示例):

//密码编码为哈希值
func HashPassword(password string) (string, error) {
	start:=time.Now()
	bytes, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost)//bcrypt.DefaultCost默认数值10,编码一次100ms以内,可增大数值,增加破解时间成本,例如设置为14,编码一次1s以上
	time:=time.Since(start)
	log.Printf("Encode Password time:%s",time)
	return string(bytes), err
}
//验证密码,例如实际业务中登录密码与数据库存储的哈希值比较,以此验证是否相等
func MatchPasswordHash(password, hash string) bool {
	err := bcrypt.CompareHashAndPassword([]byte(hash), []byte(password))
	return err == nil
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值