Go使用bcrpyt哈希用户密码

bcrypt相较于MD5,SHA-1…SHA-256等哈希算法更适合用于做密码的哈希,原因就是bcrypt算法哈希字符串的速度远远慢于上面列举的那些算法。这样即使整个用户密码库被用户盗用后想要通过彩虹表和暴力破解的方法猜测出用户的密码代价会非常高昂。今天的文章里就主要来看一下bcrypt哈希的组成部分以及在Go语言里如何使用bcrypt对密码字符串进行哈希。
所以我们使用这个方法做加密的时候也要考虑到性能问题。基于现在的状况单纯的使用MD5
也是有可能会被暴力破解的,也可以使用md5加盐的方式来做密码验证,不过还是看自己的需求选择合适自己的方法

bcrypt哈希字符串的组成
bcrypt哈希由多个部分组成。这些部分用于确定创建哈希的设置,从而可以在不需要任何其他信息的情况下对其进行验证。
在这里插入图片描述

上图是一个bcrypt哈希的示例图,其由四部分组成:

Prefix说明了使用的bcrypt的版本
Cost是进行哈希的次数-数字越大生成bcrypt的速度越慢,成本越大。同样也意味着如果密码库被盗,攻击者想通过暴力破解的方法猜测出用户密码的成本变得越昂贵。
Salt是添加到要进行哈希的字符串中的随机字符(21.25个字符),所以使用bcrypt时不需要我们在表里单独存储Salt。
Hashed Text是明文字符串最终被bcrypt应用这些设置哈希后的哈希文本。
另外无论什么方法:每个密码加单独的盐进行哈希,使用bcrypt进行哈希等等,如果用户使用非常简单的密码例如password或123456,还是能被猜测出来的,所以在用户设置密码时应该禁止他们输入简单的密码。

Go语言使用bcrypt
bcrypt的原理和实现都非常复杂,不过常用的编程语言都有实现bcrypt的包让我们直接使用,在Go语言里是通过golang.org/x/crypto/bcrypt包提供bcrypt相关功能给开发者使用的。

接下来我们在http_demo项目里演示一下使用bcrypt做密码哈希和验证的方法,首先我们需要安装一下bcrypt包

$ go get golang.org/x/crypto/bcrypt
bcrypt包只提供了三个函数:

CompareHashAndPassword 用于比对bcrypt哈希字符串和提供的密码明文文本是否匹配。
GenerateFromPassword以给定的Cost返回密码的bcrypt哈希。如果给定的成本小于MinCost,则将成本设置为DefaultCost(10)。
Cost返回用于创建给定bcrypt哈希的哈希成本。将来密码系统为了应对更大的计算能力而增加哈希成本时,该功能可以用于确定哪些密码需要更新。
我们演示bcrypt库三个函数的功能

package main

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

func HashPassword(password string) (string, error) {
	bytes, err := bcrypt.GenerateFromPassword([]byte(password), 14)
	return string(bytes), err
}

func CheckPasswordHash(password, hash string) bool {
	err := bcrypt.CompareHashAndPassword([]byte(hash), []byte(password))
	return err == nil
}

func GetHashingCost(hashedPassword []byte) int {
	cost, _ := bcrypt.Cost(hashedPassword) // 为了简单忽略错误处理
	return cost
}

func main() {
	password1 := "sec1222222222222222222222222222222222222"
	password2 := "sec12"
	password3 := "sec12"

	hash1 ,_ :=HashPassword(password1)
	hash2 ,_ := HashPassword(password2)
	hash3 ,_ := HashPassword(password3)
	fmt.Println(hash1)
	fmt.Println(hash2)
	fmt.Println(hash3)
	fmt.Println(CheckPasswordHash(password1,hash2))
	fmt.Println(CheckPasswordHash(password3,hash2))
}

在这里插入图片描述
我们可以看到 2跟3 字符串相同 加密出来的字串并不相同 并且用3去跟2作比较是true表示密码相同
但是1就正好相反

猜你喜欢

转载自blog.csdn.net/weixin_45413603/article/details/107144247
今日推荐