Go Lang使用bcrypt对用户数据加密,避免字典攻击

Go语言提供了一种较为安全的加密方式,使用GoLang golang.org/x/crypto/bcrypt 模块,通过该模块可以快速实现密码的存储处理,每次运行,计算的密码值都不同。因此使用GoLang golang.org/x/crypto/bcrypt 模块对密码进行处理,可以避免字典攻击。

1.命令行下安装 bcrypt 包:

go  get golang.org/x/crypto/bcrypt

 
2.安装bcrypt包失败,使用代理或者直接使用Git拉取:

git clone https: //github.com/golang/crypto.git

 

3.bcrypt对数据加密处理

package main

import (
    "fmt"
    "golang.org/x/crypto/bcrypt"
)

func main() {
    hashpass := enPass( "admin" )  // 密码加密,返回加密后的密码
    checkPwd( "admin" , hashpass)  // 校验密码
}

// 加密
func enPass(passWd  string )  string {
    fmt.Println( "====模拟注册时密码加密====" )
    // 1、获取用户传来的pwd,使用字节切片转换
    originPwd := [] byte (passWd)
    // 2、调用 bcrypt.GenerateFromPassword 生成加密字符串
    hashPwd, err := bcrypt.GenerateFromPassword(originPwd, bcrypt.DefaultCost)
    if err != nil {
        fmt.Println(err)
    }
    // 3、此时 hashPwd 为字节切片,实际加密字符串需使用string转换
    encodePWD :=  string (hashPwd)  // 可以将此加密串保存到数据库,可作为密码匹配验证
    fmt.Println(encodePWD)
    return encodePWD
}

/*
 * 验证密码是否匹配
 * input_pass 用户输入的密码
 * data_pass 数据库中查询出的加密后的密码
 */
func checkPwd(inputPass, dataPass  string )  bool {
    fmt.Println( "====模拟登录====" )
    // 1、将数据库中的加密串做字节切片转换
    //byteHashPwd := []byte("$2a$10$XgJGdy.uxXPBWgw6povXNeds8JjJ9KOJiTp96MutoDus1x5nUuTOS") // 从数据库中读取到的加密后的密码数据
    byteHashPwd := [] byte (dataPass)  // 实际的加密字符串

    // 2、调用 bcrypt.CompareHashAndPassword 证密码是否匹配
    // 第一个参数为通过字节切片转换的加密的哈希串、第二个参数为字节切片转换过的用户输入密码值
    err := bcrypt.CompareHashAndPassword(byteHashPwd, [] byte (inputPass))
    // 没有错误则密码匹配
    if err != nil {
        fmt.Println( "pwd wrong" , err)
        return false
    }  else {
        fmt.Println( "pwd ok" )
        return true
    }
}

 

posted @ 2026-02-22 00:33  知秋's  阅读(0)  评论(0)    收藏  举报