Go的MD5加密
Message Digest Algorithm 5 信息摘要算法
特性:
压缩性:任意长度的数据,算出MD5值的长度都是固定的
容易计算:从原始数据计算MD5值很容易
抗修改性:从原始数据进行任何修改,哪怕1个字节,MD5值差异很大
强碰撞:想找到两个不同的数据,使他们具有相同的MD5值,非常困难
不可逆性:不可反解(但是常见的弱密码是可以暴力破解的)
示例:
package main
import (
"crypto/md5"
"encoding/hex"
"fmt"
"io"
)
//MD5的方法
func genMD5(code string) string {
Md5 := md5.New()
_, _ = io.WriteString(Md5, code)
return hex.EncodeToString(Md5.Sum(nil))
}
func main() {
//生成MD5
fmt.Println(genMD5("123456"))
}
MD5盐值加密:
加盐
通过生成随机数和MD5生成字符串进行组合
数据库同时存储MD5值和salt值,验证正确性使用salt进行MD5即可
安装:
go get github.com/anaskhan96/go-password-encoder
示例:
package main
import (
"crypto/md5"
"crypto/sha512"
"encoding/hex"
"fmt"
"github.com/anaskhan96/go-password-encoder"
"io"
"strings"
)
//MD5的方法
func genMD5(code string) string {
Md5 := md5.New()
_, _ = io.WriteString(Md5, code)
return hex.EncodeToString(Md5.Sum(nil))
}
func main() {
//生成MD5
//fmt.Println(genMD5("123456")) //e10adc3949ba59abbe56e057f20f883e
//// go-password-encoder 的基本用法
//salt, encodedPwd := password.Encode("generic password", nil)
//fmt.Println(salt)
//fmt.Println(encodedPwd)
//
//check := password.Verify("generic password", salt, encodedPwd, nil)
//fmt.Println(check) // true
// Using custom options
rawPwd := "AdM^Rt!e$s5j"
options := &password.Options{16, 100, 32, sha512.New}
salt, encodedPwd := password.Encode(rawPwd, options)
//数据库中存储加密算法,盐值和encodedPwd
newPassword := fmt.Sprintf("$pbkdf2-sha512$%s$%s", salt, encodedPwd)
//fmt.Println(salt)
//fmt.Println(encodedPwd)
//fmt.Println(len(salt + encodedPwd))
fmt.Println(newPassword)
fmt.Println(len(newPassword))
//解析
passwordInfo := strings.Split(newPassword, "$")
for i, v := range passwordInfo {
fmt.Println(i, v)
/*
0
1 pbkdf2-sha512
2 67H93DQAJlJlXzIV
3 06feadd1ecf5268dcdf0255dca5c128927538852b114dd0fea451a6e16534309
*/
}
//验证 password.Verify(原始密码,salt,encodedPwd,options)
check := password.Verify(rawPwd, passwordInfo[2], passwordInfo[3], options)
fmt.Println(check) // true
}