首页 > 其他分享 >随记一下之 bcrypt

随记一下之 bcrypt

时间:2023-02-27 09:22:05浏览次数:49  
标签:加密 string err 一下 密码 password bcrypt 随记

用户密码加密

bcrypt 是专门为密码存储而设计的算法,基于 Blowfish 加密算法变形而来,由 Niels Provos 和 David Mazières 发表于 1999 年的 USENIX。

bcrypt 最大的好处是有一个参数(work factor), 可用于调整计算强度,而且 work factor 是包括在输出的摘要中的。随着攻击者计算能力的提高,使用者可以逐步增大 work factor,而且不会影响已有用户的登陆。

bcrypt 经过了很多安全专家的仔细分析,使用在以安全著称的 OpenBSD 中,一般认为它比 PBKDF2 更能承受随着计算能力加强而带来的风险。bcrypt 也有广泛的函数库支持,因此我们建议使用这种方式存储密码。

参考链接:如何安全的存储密码

bcrypt 包

Go 的官方包是非常棒的密码加密解决方案,同一个字符串经过每一次加密出来的结果都不一样,也就是不可逆,这样杜绝了黑客拿到加密数据以后倒推数据的可能。

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

用法

// Hash 使用 bcrypt 对密码进行加密
func Hash(password string) string {
    // GenerateFormPassword 函数的第二个参数是 cost 值,建议大于 12,数值越大耗费时间越长
    bytes, err := bcrypt.GenerateFormPassword([]byte(password), 14)
    logger.LogError(err)

    return string(bytes)
}

// CheckHash 对比明文密码和数据库的哈希值
func CheckHash(password, hash string) bool {
    err := bcrypt.CompareHashAndPassword([]byte(hash), []byte(password))
    logger.LogError(err)
    return err == nil
}

// IsHashed 判断字符串是否是哈希过的数据
func IsHashed(str string) bool {
    // bcrypt 加密后的长度等于 60
    return len(str) == 60
}

配合 GORM 模型钩子使用

GORM 模型钩子 是在创建、查询、更新、删除等操作之前、之后调用的函数。为模型定义指定的方法,它会在创建、更新、查询、删除时自动被调用。如果任何回调返回错误,GORM 将停止后续的操作并回滚事务。

// BeforeSave GORM 的模型钩子,在模型创建和更新前调用
// User 为定义的模型
func (u *User) BeforeSave(tx *gorm.DB) (err error) {
    // 如果不是哈希过的数据,则进行哈希,password 是自定义封装 hash 的包名
    if !password.IsHashed(u.Password) {
        u.Password = password.Hash(u.Password)
    }
    return
}

标签:加密,string,err,一下,密码,password,bcrypt,随记
From: https://www.cnblogs.com/xylx1/p/17158548.html

相关文章

  • 今天整理一下Android studio安装时遇到的问题-心血来潮
    1:每日总结-23.2.21-lao_bing-博客园(cnblogs.com)2:Androidstudio安装教程_一纸梦的博客-CSDN博客_androidstudio3:AndroidStudio中创建项目时,activity_main.xml不......
  • 开课博客,顺便把今天的水一下。 2023.2.25
    一、介绍自己  来自信息科学与技术学院的信2105-3班的孟德昊,喜欢打游戏看番剧,不喜欢学习,二、现状,经验和计划 现状就是学习不挂科就算成功,学习不是很上心,主要是没心......
  • 记录一下使用VScode运行C/C++程序
    三个文件:c_cpp_properties.json、launch.json、tasks.json1.c_cpp_properties.json的生成第一步:   第二步   则会生成   2.tasks.json  3.la......
  • Java多线程面试题:描述一下线程安全活跃态问题,竞态条件?
    一、线程安全活跃态问题线程因为某件事情得不到执行1、活锁线程没有阻塞,但一直重复执行某个操作,并且失败重试1)例子在消息队列中,消费者没有正确a......
  • 反演随记
    零、反演的本质$$A\vec{x}=\vec{y}\iffB\vec{y}=\vec{x}$$其中\(\vec{x},\vec{y}\)为列向量,\(A,B\)为任意矩阵。所以反演的证明即证明\(A,B\)互逆,可以通过......
  • 【课程随记】机器学习
    第一节机器学习的基本概念通过优化算法,找到最好模型输入空间,输出空间输入特征向量,特征空间联合分布:输入与输出的随机变量X与Y遵循联合概率分布P(X,Y)。学习过程中假设X,......
  • 个人随记 —— 不同 VPC 下 EKS 跨集群服务访问
    背景在本文的问题前,需要对AWS的产品进行解释:VPC:VirtualPrivateCloud,AWS在单region下提供的私有网络,每个VPC都拥有一个独立网段,并且和其他VPC进行完全的私网......
  • 整理一下虚拟化与Linux的学习经历
    由于工作的原因,需要开始接触虚拟化。正好前几天学了许岑的《如何成为有效学习的高手》,其中建议成年人需要以任务驱动的方式进行学习,并且需要刻意制造反馈,比如把学习内容整......
  • 泛微OA技巧随记
    隐藏明细表的加号按钮,如果不想让用户手工添行,必须通过自动联动添明细行,可以将明细表的加号按钮隐藏.document.getElementById('$addbutton0$').style.display="none";......
  • 有没有夫妻相?刷一下脸就知道!
    摘要:本文利用ssim算法,帮你快速打造一个“刷脸测试夫妻相”Demo出来。本文分享自华为云社区《情人节季,快来上传你的女神照片,测试下你们的夫妻相》,作者:HWCloudAI。“夫......