Md5加密
[toc]
MD5 是什么
全称为 消息摘要算法版本5 (Message Digest Algorithm 5)
它是一种 Hash 算法。
作用是为了信息安全。
md5特性:
不可逆性 — 根据 MD5 值计算不出原始数据
唯一性 — 不同原始数据会有不同的 MD5 值 (不完全可靠,后面说)
MD5 到底算不算加密算法?仁者见仁智者见智吧。说它是加密,因为它确实把原始数据,比如用户密码,变成了一般人看不懂的 MD5 值;说它不是加密,因为它不能解密。
据说 Linux 系统中,用户密码,都是以 MD5 形式存在文件中的,这样你在输入密码的时候,计算机只要计算你输入密码的 MD5 再跟计算机文件中存储的 MD5 进行比对就行了
基于md5盐值加密
package main
import (
"crypto/md5"
"encoding/hex"
"fmt"
"io"
)
func Md5(code string) string {
//实例化一个md5的对象,将code写入其中
MD5 := md5.New()
_, _ = io.WriteString(MD5, code)
return hex.EncodeToString(MD5.Sum(nil))
}
func main(){
fmt.Println(Md5("123456"))
}
输出:e10adc3949ba59abbe56e057f20f883e
实践运用
在很多时候我们需要对密码进行加密,这很重要,那么我们可以使用md5盐值加密,将密码+盐值hash成一个16进制的字符串
盐值:指的是由随机数组成的字符串
这个hash的过程可以使用自己来实现,当然也可是找别人已经写好的
这里我们在github上找别人已经写好的
地址:https://github.com/anaskhan96/go-password-encoder
安装
go get github.com/anaskhan96/go-password-encoder
运行
package main
import (
"crypto/md5"
"crypto/sha512"
"encoding/hex"
"fmt"
"io"
"strings"
"github.com/anaskhan96/go-password-encoder"
)
func main() {
// Using custom options
//根据需求选择盐值长度,替换次数,key长度,加密方法
options := &password.Options{16, 100, 32, sha512.New}
//输入密码,options 返回盐值和加密后的16进制密码
salt, encodedPwd := password.Encode("generic password", options)
//这里我们根据自身需求将密文密码存储格式调整为:加密方法$盐值$16进制加密密码
//最后我们将Newpassword存储到数据库
Newpassword := fmt.Sprintf("$pbkdf2-sha512$%s$%s", salt, encodedPwd)
//分割
//当用户需要核对密码时,我们调用Newpassword,获取其中的盐值和16进制加密密码
//然后我们将用户密码和获取到的盐值进行hash,然后16进制加密密码核对
Passwordinfo := strings.Split(Newpassword, "$")
fmt.Println(Passwordinfo)
//将分割结果进行验证,将用户密码加盐,然后和encodedPwd对比
check := password.Verify("generic password", Passwordinfo[2], encodedPwd, options)
fmt.Println(check) // true
}