Golang将密码盐加密

代码地址:https://gitcode.net/m0_51510236/go_password

首先我们来初始化一个项目

go mod init go_password

golang密码加密我们可以使用 golang.org/x/crypto/bcrypt 包:

go get "golang.org/x/crypto/bcrypt"

然后我们可以在 utils 包中编写一个 password.go 文件,用于密码加密,代码如下:

package utils

import "golang.org/x/crypto/bcrypt"

// EncryptPassword 将密码加密,需要传入密码返回的是加密后的密码
func EncryptPassword(password string) (string, error) {
	// 加密密码,使用 bcrypt 包当中的 GenerateFromPassword 方法,bcrypt.DefaultCost 代表使用默认加密成本
	encryptPassword, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost)
	if err != nil {
		// 如果有错误则返回异常,加密后的空字符串返回为空字符串,因为加密失败
		return "", err
	} else {
		// 返回加密后的密码和空异常
		return string(encryptPassword), nil
	}
}

// EqualsPassword 对比密码是否正确
func EqualsPassword(password, encryptPassword string) bool {
	// 使用 bcrypt 当中的 CompareHashAndPassword 对比密码是否正确,第一个参数为加密后的密码,第二个参数为未加密的密码
	err := bcrypt.CompareHashAndPassword([]byte(encryptPassword), []byte(password))
	// 对比密码是否正确会返回一个异常,按照官方的说法是只要异常是 nil 就证明密码正确
	return err == nil
}

然后我们编写一个程序执行一下这个加密代码:

package main

import (
   "fmt"
   "go_password/utils"
)

// 程序的主入口,用于测试密码加密和对比加密后的字符串
func main() {
   // 定义密码
   password := "123456"
   // 尝试第一次加密密码
   encrypt1, _ := utils.EncryptPassword(password)
   // 打印第一次加密的密码
   fmt.Printf("第一次加密密码:%v\n", encrypt1)
   // 尝试第二次加密密码
   encrypt2, _ := utils.EncryptPassword(password)
   // 打印第二次加密的密码
   fmt.Printf("第一次加密密码:%v\n", encrypt2) // 可以发现两次加密密码是不一样的结果

   // 对比密码是否正确,第一次加密的字符串加密对比
   passwordEquals := utils.EqualsPassword(password, encrypt1)
   fmt.Printf("使用第一次加密的密码字符串对比密码是否正确:%v\n", passwordEquals)

   // 对比密码是否正确,第二次加密的字符串加密对比
   passwordEquals = utils.EqualsPassword(password, encrypt2)
   fmt.Printf("使用第二次加密的密码字符串对比密码是否正确:%v\n", passwordEquals)

   // 尝试对比一个错误的密码
   passwordEquals = utils.EqualsPassword("1234567", encrypt1) // 1234567 是错误的密码
   fmt.Printf("尝试用错误的密码对比密码是否正确:%v\n", passwordEquals)
}

运行这个 main 方法,我们可以查看结果:

代码运行结果

我们可以看到两次密码加密的结果是不一样的,因为对密码加密的时候添加了盐。这种密码加密是非常安全且不可逆的,可以放心使用,并且我们对比密码是否正确也返回了正确的结果,可以用这个方法去写一个注册登陆的功能了!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值