[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
}