Go实现随机加盐密码认证

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: Go实现随机加盐密码认证

为什么要加密


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


实现


代码

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>  

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


密码串解析


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

优缺点


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


源码分析

// 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
}
// 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
}

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


补充

1 最主要还是得用户的密码设置复杂一些(可以考虑强制), 最好是大小写加特殊字符, 还有就是提醒用户尽量不同网站用不同的密码
2 可以在密码里面加一些固有字段, 也能提升安全等级, 比如在前后或者在中间加参数再进行加密解密(用户不改我们帮他改)


目录
相关文章
|
存储 缓存 人工智能
基于Go的缓存实现
缓存是架构设计中的常用概念,本文基于Go实现了一个简单的缓存组件,支持最基本的缓存操作。
277 0
基于Go的缓存实现
|
存储 JSON 安全
(12)go-micro微服务JWT跨域认证
(12)go-micro微服务JWT跨域认证
141 0
|
存储 JSON 算法
go使用JWT进行跨域认证最全教学
go使用JWT进行跨域认证最全教学
157 0
|
关系型数据库 MySQL 中间件
使用 Go HTTP 框架 Hertz 进行 JWT 认证
上一篇文章简单介绍了一个高性能的 Go HTTP 框架——Hertz,本篇文章将围绕 Hertz 开源仓库的一个 demo,讲述如何使用 Hertz 完成 JWT 的认证与授权流程。
361 0
使用 Go HTTP 框架 Hertz 进行 JWT 认证
|
存储 缓存 NoSQL
一文搞懂Go整合captcha实现验证码功能
一文搞懂Go整合captcha实现验证码功能
|
XML JSON Java
RPC框架之Thrift—实现Go和Java远程过程调用
RPC框架之Thrift—实现Go和Java远程过程调用
|
监控 测试技术 Go
用 Go 从零实现日志包 - 第零篇 序言
设计一个日志包,需要考虑的基础功能有日志级别设置、标准输出和文件、输出格式配置、日志的时间戳、文件与打印行号、正文。高级功能有按级别分类输出、支持结构化日志、支持日志轮转。
135 0
|
Go 数据安全/隐私保护
Go 实现 AES 加密 CBC 模式|Go主题月
密码分组链接模式 CBC (Cipher Block Chaining),这种模式是先将明文切分成若干小段,然后每一小段与初始块或者上一段的密文段进行异或运算后,再与密钥进行加密。
342 0
|
Go
【Golang】panic和recover底层逻辑实现|Go主题月
在每个goroutine也有一个指针指向_panic链表表头,然后每增加一个panic就会在链表头部加入一个_panic结构体。当所有的defer执行完后,_panic链表就会从尾部开始打印panic信息了,也就是说先发生的panic先打印信息。
236 0
|
Go 索引 Python
Go 和Python中的闭包实现及使用
Go 和Python中的闭包实现及使用
121 0