golang中bcrypt包实现密码

说明:
很多系统都是将密码进行一次 MD5 或 SHA1 Hash后存入数据库中。这样的密码抵挡不住字典攻击。所谓字典攻击,
就是将常用密码进行Hash后做成一个字典,破解的时候,只需要查字典就能知道对应的明文密码。
为了抵御字典攻击,推荐的做法是使用 密码 + 盐(一串随机数) 再Hash的方式。每个密码对应一个不同的随机数。
这个方法,实际上是将密码人为地拓展了N位,导致密码长度大增,使得攻击者无法构造这么大的一个字典。

  • bcrypt是单向hash加密算法,不可反解生成明文,bcrypt是一种加盐的加密方法,

安装:
go get golang.org/x/crypto/bcrypt

使用

package main

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

func main() {
	// 方法1:
	// GenerateFromPassword 以给定的代价返回密码的 bcrypt 哈希值。如果给定的成本小于 MinCost
	// 则成本将设置为 DefaultCost。使用此包中定义的 CompareHashAndPassword 将返回的散列密码与其明文版本进行比较。
	pwd := []byte("123456")
	hash, err := bcrypt.GenerateFromPassword(pwd, bcrypt.DefaultCost)
	if err != nil {
		log.Fatalln(err.Error())
	}
	fmt.Println(string(hash))

	// CompareHashAndPassword 将 bcrypt 散列密码与其可能的明文等效密码进行比较。成功时返回 nil,失败时返回错误。
	if err := bcrypt.CompareHashAndPassword([]byte("$2a$10$OVW0MmWrPVIl8f0ACVDQme3fe8EBiMPe1U0cpfdtnDsvBlByz8/yS"), pwd); err != nil {
		fmt.Println(err.Error())
		return
	} else {
		fmt.Println("密码正确")
	}

}

总结:
password: 123456
$2a$10$BcF6iw8csEry7UallKJlO.vQdZA.G9bXGtCPJ/eVJacMGCNPxsEVC
$2a$10$OVW0MmWrPVIl8f0ACVDQme3fe8EBiMPe1U0cpfdtnDsvBlByz8/yS
$2a$10$tMdrC/33wJ8B7tR3ThaBeuYiPba5XDqIMyO45DauAVkPOslULLQHO

说明,每次运行计算的密码值都不相同,因此使用bcrypt模块对密码进行处理,可以避免字典攻击

官方文档

posted @ 2022-04-29 10:44  专职  阅读(796)  评论(0编辑  收藏  举报