bcrypt密码获取建议进行多少轮?

问题描述 投票:0回答:2

我正在学习 Nodejs 背景下的传递哈希,我想知道你会推荐什么盐级别。默认级别是 10,我想知道这对于少于 10 个用户的基本应用程序是否足够好。

node.js bcrypt
2个回答
9
投票

为了回答你的问题,我做了一个简单的测试Python脚本:

#!/usr/bin/env python3

import bcrypt
import time

passwd = b's$cret12'
for i in range(4,17):
    print(f'Rounds:{i}')
    start = time.time()
    salt = bcrypt.gensalt(rounds=i)
    hashed = bcrypt.hashpw(passwd, salt)
    end = time.time()
    print(f'Rounds:{i} | Time: {end - start:.4f} s')

在 Intel(R) Xeon(R) CPU E5-2620 v4 @ 2.10GHz 上得到以下结果:

Rounds:4 | Time: 0.0016 s
Rounds:5 | Time: 0.0029 s
Rounds:6 | Time: 0.0060 s
Rounds:7 | Time: 0.0115 s
Rounds:8 | Time: 0.0232 s
Rounds:9 | Time: 0.0459 s
Rounds:10 | Time: 0.0907 s /* Good enough */
Rounds:11 | Time: 0.1834 s /* Worth to consider */
Rounds:12 | Time: 0.3563 s /* >250ms as it discussed in comments */ 
Rounds:13 | Time: 0.7215 s 
Rounds:14 | Time: 1.4437 s /* In critical systems for superuser password */
Rounds:15 | Time: 2.9140 s
Rounds:16 | Time: 5.8405 s

因此,您可以考虑这些数字来了解根据常用单词的哈希表检查 1 个密码需要多长时间。

今天,我认为每个密码 0.1 秒左右就足够了(如果您不允许用户使用“123456”等简单密码)。因此,考虑 10 或 11 轮。

  • 请记住,它并不能保护您的用户,而只是为他们赢得时间 一旦您的密码数据库被保存,请安全地更改他们的密码 妥协了。

Apple M3 MAX(40 核)更新:

Rounds:7 | Time: 0.0107 s
Rounds:8 | Time: 0.0214 s
Rounds:9 | Time: 0.0426 s
Rounds:10 | Time: 0.0848 s
Rounds:11 | Time: 0.1691 s
Rounds:12 | Time: 0.3380 s
Rounds:13 | Time: 0.6782 s
Rounds:14 | Time: 1.3506 s

2
投票

您有多少用户并不重要。有人可能会说,如果您只有 10 个用户,那么每个用户就有更多资源来保证他们的安全。

对于多少轮是可以的问题,一个好的答案是回答一个问题 - 在不降低性能的情况下,你可以承受多少轮?

有时默认值就很好,但有时您可以做得更好。您确实必须亲自测试并衡量影响。

© www.soinside.com 2019 - 2024. All rights reserved.