MD5加密

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上找别人已经写好的

地址:github.com/anaskhan96/go-password-...

安装
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
}
本作品采用《CC 协议》,转载必须注明作者和本文链接
刻意学习
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!
未填写
文章
118
粉丝
89
喜欢
173
收藏
246
排名:365
访问:2.6 万
私信
所有博文
社区赞助商