Go的MD5加密

Message Digest Algorithm 5 信息摘要算法

特性:

  1. 压缩性:任意长度的数据,算出MD5值的长度都是固定的

  1. 容易计算:从原始数据计算MD5值很容易

  1. 抗修改性:从原始数据进行任何修改,哪怕1个字节,MD5值差异很大

  1. 强碰撞:想找到两个不同的数据,使他们具有相同的MD5值,非常困难

  1. 不可逆性:不可反解(但是常见的弱密码是可以暴力破解的)

示例:

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盐值加密:

  1. 加盐

通过生成随机数和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

}