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
}