首页 > 其他分享 >(转)Go实现随机加盐密码认证

(转)Go实现随机加盐密码认证

时间:2023-11-30 15:56:24浏览次数:29  
标签:return err nil 认证 加盐 cost Go password bcrypt

原文:https://juejin.cn/post/7068192471498358821

为什么要加密

人们往往有使用同一密码的习惯, 为了防止数据库意外泄露/破坏和出于保护用户隐私的目的, 不应在数据库里存入用户密码明文

实现

代码

  scss 复制代码
package main

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

func main() {
	password := []byte("thisIsPassWord")
	nowG := time.Now()
	hashedPassword, _ := bcrypt.GenerateFromPassword(password, bcrypt.DefaultCost)
	fmt.Println("加密后", string(hashedPassword), "耗时", time.Now().Sub(nowG))
	nowC := time.Now()
	err := bcrypt.CompareHashAndPassword(hashedPassword, password)
	fmt.Println("验证耗费时间", time.Now().Sub(nowC))
	fmt.Println(err)
}

// 结果
// 加密后 $2a$10$ESkb/bwSyISLgq1bOH0C2utXdb.hcH9oBQD1hUnfDOzm4bMKK6EX2 耗时 67.9985ms
// 验证耗费时间 66.0008ms
// <nil>  

将加密后的密码串存入数据表, 然后用户登录传递明文密码(也可以前段加密后端再解密成明文)进行验证

密码串解析

  shell 复制代码
$2a$10$ESkb/bwSyISLgq1bOH0C2utXdb.hcH9oBQD1hUnfDOzm4bMKK6EX2
$ 为分隔符
2a bcrypt加密版本号
10 Cost值
ESkb/bwSyISLgq1bOH0C2utXdb 盐
hcH9oBQD1hUnfDOzm4bMKK6EX2 密码密文

优缺点

  makefile 复制代码
优点:
    单向HASH,不可解密
    盐值随机(有效防止彩虹表碰撞)
    破解时间成本极高
缺点:
    效率较慢(相较于mad5/sha算法)

源码分析

  go 复制代码
// GenerateFromPassword returns the bcrypt hash of the password at the given
// cost. If the cost given is less than MinCost, the cost will be set to
// DefaultCost, instead. Use CompareHashAndPassword, as defined in this package,
// to compare the returned hashed password with its cleartext version.
func GenerateFromPassword(password []byte, cost int) ([]byte, error) {
	p, err := newFromPassword(password, cost)
	if err != nil {
		return nil, err
	}
	return p.Hash(), nil
}


func newFromPassword(password []byte, cost int) (*hashed, error) {
   if cost < MinCost {
      cost = DefaultCost
   }
   p := new(hashed)
   p.major = majorVersion
   p.minor = minorVersion

   err := checkCost(cost)
   if err != nil {
      return nil, err
   }
   p.cost = cost

   unencodedSalt := make([]byte, maxSaltSize)
   _, err = io.ReadFull(rand.Reader, unencodedSalt)
   if err != nil {
      return nil, err
   }

   p.salt = base64Encode(unencodedSalt)
   hash, err := bcrypt(password, p.cost, p.salt)
   if err != nil {
      return nil, err
   }
   p.hash = hash
   return p, err
}


// CompareHashAndPassword compares a bcrypt hashed password with its possible
// plaintext equivalent. Returns nil on success, or an error on failure.
func CompareHashAndPassword(hashedPassword, password []byte) error {
	p, err := newFromHash(hashedPassword)
	if err != nil {
		return err
	}

	otherHash, err := bcrypt(password, p.cost, p.salt)
	if err != nil {
		return err
	}

	otherP := &hashed{otherHash, p.salt, p.cost, p.major, p.minor}
	if subtle.ConstantTimeCompare(p.Hash(), otherP.Hash()) == 1 {
		return nil
	}

	return ErrMismatchedHashAndPassword
}

加密就是随机生成16位byte再转成base64当做salt, 用salt和cost进行加密

解密就是用已有的加密哈希的salt和cost对现有密码进行加密来确认密码密文是否一致

标签:return,err,nil,认证,加盐,cost,Go,password,bcrypt
From: https://www.cnblogs.com/liujiacai/p/17867540.html

相关文章

  • Django四件套在响应头中放入数据的方法
    HttpResponse方法一:returnHttpResponse('ok',headers={'xxx':'xxx'})方法二:obj=HttpResponse('ok')obj['yyy']='yyy'#像字典一样放入,最终会放在http的响应头中returnobj redirect无法直接传headers=传入数据方法:obj=......
  • [good]enum
    typedefenum{Reg_Set_Speed=100,//100Reg_Set_Enable_VSP,//101Reg_Set_Dir,//102Reg_Force_Stop}Modbus_Holding_Registors;这是一个C语言中的`enum`(枚举)类型定义。枚举是一种用户定义的数据类型,它可以包含几个用户定义的值。在这个例子中,`M......
  • [good]数据类型
    `uint`是一种无符号整数类型,它的全称是"unsignedint"。这种类型可以表示从0到某个正数的值。具体能表示的最大值取决于实现,但在大多数现代系统上,`uint`通常是32位的,可以表示的最大值是4294967295。与此相比,`uint8_t`和`uint32_t`是固定宽度的整数类型,它们的位宽分别是8位和32位......
  • supervisor管理启动重启,Java,Go程序Demo
    简介Supervisor是一款Python开发的进程管理系统,允许用户监视和控制Linux上的进程,能将一个普通命令行进程变为后台守护进程,异常退出时能自动重启1、安装yum-yinstallsupervisor2、配置默认配置文件echo_supervisord_conf>/etc/supervisord.conf3、修改主配置文件......
  • golang常用包详解之: errgroup
    前言:并发编程在现代软件开发中变得越来越重要。Go语言通过goroutine和channel等语言特性为并发编程提供了非常强大的支持,但是在实际开发中,如何有效管理多个goroutine并处理它们可能产生的错误是一个挑战。这时,Go语言的官方库中的errgroup包就能发挥作用。正文:1.errgroup包概述errg......
  • go的GPM - 协程的本质
    协程与线程线程在创建、切换、销毁时候,需要消耗CPU的资源。协程就是将一段程序的运行状态打包,可以在线程之间调度。减少CPU在操作线程的消耗进程用分配内存空间线程用来分配CPU时间协程用来精细利用线程协程的本质是一段包含了运行状态的程序后面介绍后,会对这个概念更好......
  • 安装go
    1.安装包直接安装2.配置环境变量GOPARH:新建的,用来存放go项目代码的地址GOROOT:你安装go的目录 3.创建文件目录在GOPATH地址下面,创建3个文件夹 ......
  • nango 通用api 集成平台
    nango通用api集成平台包含的特性超过100+的api认证可以双向数据同步基于通用api的快速访问自动api限速,重试以及分页自定义模式的强类型支持webhook以及实时数据同步支持内置监控admindshboard访问说明nango提供了好几种模式,免费自托管,云,企业自托管,免费自托......
  • Nacos 认证绕过漏洞
    Nacos认证绕过漏洞(CVE-2021-29441)Nacos是阿里巴巴推出的一个新开源项目,是一个更易于构建云原生应用的动态服务发现,配置管理和服务管理平台。致力于帮助发现、配置和管理微服务。Nacos提供了一组简单易用的特性集,可以快速实现动态服务发现、服务配置、服务元数据及流量管理。该......
  • 标题:计算机考试认证的重要性及应对策略
    摘要:计算机考试认证是现代社会中,评估和确认个人计算机技能水平的重要方式之一。本文旨在探讨计算机考试认证的重要性以及应对策略,以帮助读者更好地理解和应对这一面临的挑战。一、引言随着计算机技术的迅猛发展,计算机已经成为现代社会不可或缺的一部分。然而,与此同时,计算机技术也变......