You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

bcrypt库CompareHashAndPassword方法运行缓慢的原因是什么?

为什么bcrypt.CompareHashAndPassword运行速度极慢?

嘿,这其实不是bug,而是bcrypt故意设计成这样的!

你遇到的这个“慢”,恰恰是bcrypt作为密码哈希算法的核心优势所在——它就是为了让暴力破解变得无比困难才这么做的。具体原因可以拆解成这几点:

  • 自适应哈希的设计初衷:bcrypt属于自适应密码哈希函数,它的核心目标是对抗暴力破解攻击。暴力破解需要攻击者反复尝试成千上万的密码组合,而bcrypt通过故意增加计算耗时,直接拉高了攻击者的破解成本——哪怕用高性能GPU集群,每秒能尝试的密码数量也会被大幅压缩。
  • 工作因子(Cost Factor)的影响:你看你用的哈希值$2a$14$RWV9NhWmlQmSoV9toM/k9OIzaNcYssCiauPVAljiX2NGhqvyxcOMy,其中的14就是工作因子。这个数值决定了哈希计算的迭代次数:工作因子每增加1,计算时间就会翻倍。你用的14已经是中等偏高的数值了,对比默认的10,耗时会是它的16倍(2^(14-10)=16)。
  • 比对过程的计算量CompareHashAndPassword的工作逻辑是,用输入的密码,结合哈希值里记录的盐值和工作因子,重新执行一遍哈希计算,再和存储的哈希结果比对。所以这个过程的耗时和生成该哈希时的耗时是几乎一致的,自然会比较久。

一些小建议

如果这个耗时已经影响到你的业务体验,可以考虑:

  • 适当降低工作因子(比如调到12),但要注意:工作因子越低,破解难度也会随之降低,需要在安全性和性能之间找到平衡。
  • 行业内一般建议把单次哈希/比对的耗时控制在100-200毫秒左右,这样既不会让用户有明显的等待感,又能保持足够的安全门槛。

附上你的测试代码:

var b []byte = []byte("1234")
var bx []byte = []byte("$2a$14$RWV9NhWmlQmSoV9toM/k9OIzaNcYssCiauPVAljiX2NGhqvyxcOMy")
fmt.Println("Start Compare: ", time.Now().Format("2006-01-02 15:04:05.000000"))
err := bcrypt.CompareHashAndPassword(bx, b)
fmt.Println("Completed Compare: ", time.Now().Format("2006-01-02 15:04:05.000000"))
fmt.Println("------------------------")

内容的提问来源于stack exchange,提问作者A.kadir olmez

火山引擎 最新活动