前言

加密算法肯定可以解密。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
}