热点、深度、趋势全掌握,尽在BTC区块圈

Argon2、bcrypt、scrypt 还是 PBKDF2?

_Argon2、bcrypt、scrypt 还是 PBKDF2?_Argon2、bcrypt、scrypt 还是 PBKDF2?

Argon2, bcrypt, scrypt 还是 PBKDF2?

网络安全最基本的原则之一是,哈希方法基本上分为两类:快速的和慢速的。由此,我们有 MD5、SHA-1、SHA-256 等快速哈希方法,以及 Argon2、Bcrypt、scrypt 和 PBKDF2 等慢速哈希方法。下面,我使用 WASM 和 JavaScript 实现了每种方法:

希望总的来说,我们已经过了使用 MD5 或 SHA1 对密码进行哈希处理的阶段,因为这些方法可能很弱。基本上,MD5 和 SHA1 是快速哈希方法,可以在其中快速尝试许多可能的密码。 bcrypt 和 Argon 2 减慢了这一过程,从而大大降低了哈希速率。那么,你应该使用哪一个呢?

bcrypt

MD5 和 SHA-1 生成哈希签名,但可以通过彩虹表对其进行攻击。Bcrypt 是一种更强大的密码哈希生成器,它使用 salt 来创建非重复哈希。它由 Niels Provos 和 David Mazières 设计,基于 Blowfish cipher。它被用作 BSD 和其他系统的默认密码哈希方法。总的来说,它使用 128 位的 salt 值,这需要 22 个 Radix-64 字符。它可以使用多次迭代,这将减慢对哈希值的任何暴力破解。

Argon2、bcrypt、scrypt 还是 PBKDF2?_Argon2、bcrypt、scrypt 还是 PBKDF2?_

最近使用 hashcat 的 AWS EC2 服务器基准测试突出了 Bcrypt 的慢速 :

Hash type: MD5 Speed/sec: 380.02M words
Hash type: SHA1 Speed/sec: 218.86M words
Hash type: SHA256 Speed/sec: 110.37M words
Hash type: bcrypt, Blowfish(OpenBSD) Speed/sec: 25.86k words
Hash type: NTLM. Speed/sec: 370.22M words

因此,我们从每秒 3.8 亿个单词转移到每秒仅 25,860 个单词。

工作因子是 2^轮数,默认情况下通常设置为 11。设置为 11(这与大多数实现中的默认值相匹配,并且目前被认为是良好的安全/风险级别)。映射是:

| Cost  | Iterations               |
    |-------|--------------------------|
    |   8   |    256 iterations        |
    |   9   |    512 iterations        |
    |  10   |  1,024 iterations        |
    |  11   |  2,048 iterations        |
    |  12   |  4,096 iterations        |
    |  13   |  8,192 iterations        |
    |  14   | 16,384 iterations        |
    |  15   | 32,768 iterations        |
    |  16   | 65,536 iterations        |
    |  17   | 131,072 iterations       |
    |  18   | 262,144 iterations       |
    |  19   | 524,288 iterations       |
    |  20   | 1,048,576 iterations     |
    |  21   | 2,097,152 iterations     |
    |  22   | 4,194,304 iterations     |
    |  23   | 8,388,608 iterations     |
    |  24   | 16,777,216 iterations    |
    |  25   | 33,554,432 iterations    |
    |  26   | 67,108,864 iterations    |
    |  27   | 134,217,728 iterations   |
    |  28   | 268,435,456 iterations   |
    |  29   | 536,870,912 iterations   |
    |  30   | 1,073,741,824 iterations |
    |  31   | 2,147,483,648 iterations |

这是使用 WASM 的 bcrypt:

使用带有 JavaScript 的 WASM 的 Bcrypt \bcrypt 由 Niels Provos 和 David Mazières 于 1999 年创建 ,作为一种密码哈希方法。它基于 Blowfish…\asecuritysite.com

Argon 2

Argon2 在 RFC 9106 中定义,标题为“用于密码哈希和工作量证明应用的内存硬函数”。用于密码哈希、密钥派生和工作量证明。主要变体是 Argon2id,它针对 x86 架构进行了优化。它有两个子变体:Argon2d 和 Argon2i。总的来说,Argon2d 提供数据相关的内存访问方法,适用于加密货币和工作量证明应用。它也没有任何侧信道定时攻击的威胁。或者,Argon2i 使用数据独立的内存访问,可用于密码哈希和基于密码的密钥派生 (KDF)。

Argon 2 中使用的主要参数在图 1 中定义,例如迭代、memcost 和并行性。标准形式为:

$argon2i$v=19$m=4096,t=2,p=4$salt$rZHPyRIa8XEvQ9rVqpvoibllLagNNGUeCNCmxeZfgBA

其中 v=19 标识我们正在使用 Argon 2。然后,这些参数在“m=4096,t=2,p=4”中定义,其中我们的内存成本为 4,096 字节,并行性为 4,迭代次数为 2。在这种情况下,salt 为“salt”,派生的哈希为“rZHPyRIa8XEvQ9rVqpvoibllLagNNGUeCNCmxeZfgBA”。Argon 2 也可以使用定义的字节数(摘要大小)输出。

Argon2、bcrypt、scrypt 还是 PBKDF2?__Argon2、bcrypt、scrypt 还是 PBKDF2?

这是带有 WASM 的 Argon 2:

使用带有 JavaScript 的 WASM 的 Argon2 \Argon2 在 RFC 9106 中定义,标题为“用于密码哈希和工作量证明的内存硬函数…\asecuritysite.com

scrypt

scrypt 基于 Colin Percival 的一篇原始论文:

Argon2、bcrypt、scrypt 还是 PBKDF2?__Argon2、bcrypt、scrypt 还是 PBKDF2?

该论文对成本进行了以下估算:

_Argon2、bcrypt、scrypt 还是 PBKDF2?_Argon2、bcrypt、scrypt 还是 PBKDF2?

参考资料

由此,我们看到 scrypt 的破解成本远高于 bcrypt 和 PBKDF2。在这种情况下,对于每种方法生成密钥的大致相同的时间,scrypt 的成本总是高得多。对于 10 个字符,我们看到 PBKDF2(5.0 秒)的成本为 1000 万英镑,而 scrypt 的相同成本为 2100 亿美元。即使有六个字符,破解 scrypt 的成本也为 900 美元。

它使用密码和 salt 值并计算内存硬计算。 为此,它采用与大多数 KDF 不同的方法,具有多个参数:块大小 (r) 和 CPU/内存成本参数 (N — 2 的幂) 和并行量 (p)。 计算的核心不是哈希函数,而是 Salsa20/8 Core — 它是 Salsa20 Core 的精简变体。

总的来说,可以使用 N、r 和 p 运行系统,这与可用的内存和计算能力以及所需的并行量有关。可以看出 r = 8 且 p = 1 给出良好的结果。

2016 年的一项评估 , 概述了 2^N、r 和 p 的值对计算密钥的时间的影响:

Argon2、bcrypt、scrypt 还是 PBKDF2?_Argon2、bcrypt、scrypt 还是 PBKDF2?_

在此,我们看到增加参数会增加所需内存的大小。 如果 GPU 具有一定大小的内存,我们可以确保我们使其溢出。 推荐参数为:

使用的内存为:

Memory (Bytes) = (128.N.r) + (128.r.p)

如果我们使用上面的参数,我们会得到:

Memory = (128 * 214 * 8) + (128 * 8 * 1) = 16,778,240 bytes (16 MB)

带有 WASM 的 scrypt 编码为:

使用带有 JavaScript 的 WASM 的 scrypt \基于密码的密钥派生函数 (KDF) 的重点是从秘密中派生秘密。 这包括…\asecuritysite.com

PBKDF2

PBKDF2 是一种简单的哈希方法,在 RFC 2898 中定义 :

Argon2、bcrypt、scrypt 还是 PBKDF2?_Argon2、bcrypt、scrypt 还是 PBKDF2?_

但是,它像其他一些方法一样保护你的在线安全。 为什么? 因为每次你连接到 Wifi 网络时,都是 PBKDF2(基于密码的密钥派生函数 2)保护你的 Wifi 密码。 总的来说,它使用多个哈希迭代来确定最终的哈希值,其中这些迭代会减慢哈希过程。 并且,当我们向哈希添加 salt 时,攻击者无法使用彩虹表来破解密码。 通常,攻击者每秒只能尝试不到 1,000 个密码短语,而像 SHA-256 这样的快速哈希方法,可以允许尝试 10 万个。

TrueCrypt

通常,PBKDF2 也用于从已定义的密码创建加密密钥,并且无法从哈希值反转密码。 否则,我们可以使用它来保护敏感资产,例如在 TrueCrypt 中使用它来生成读取加密驱动器的标头信息所需的加密密钥,该标头信息存储加密密钥。 在 TrueCrypt 中,我们使用 PBKDF2 生成密钥(带有 salt),它将解密标头并显示用于加密磁盘的密钥(使用 AES、3DES 或 Twofish):

Argon2、bcrypt、scrypt 还是 PBKDF2?_Argon2、bcrypt、scrypt 还是 PBKDF2?_

我们这样使用它:

byte[] result = passwordDerive.GenerateDerivedKey(16,
   ASCIIEncoding.UTF8.GetBytes(message), salt, 1000);

它具有 16 字节(128 位 — dklen)的密钥长度,使用 salt 字节数组,并且哈希迭代 1000 次(Miterations)。 你应该发现生成的哈希值将具有 32 个十六进制字符(16 字节)。

WPA2

PBKDF2 的通用格式为:

DK = PBKDF2(Password, Salt, Miterations, dkLen)

其中 Password 是密码,Salt 是 salt,Miterations 是迭代次数,dklen 是派生哈希的长度。 总的来说,我们可以创建与我们的应用程序匹配的大小的 DK。

但是,它的主要用途是在 WPA-2 中,我们在其中创建了密码的哈希版本。 因此,WPA-2 使用 4,096 次迭代。 它的主要重点是生成密码的哈希版本,并包括一个 salt 以减少彩虹表攻击的机会。 它通常使用超过 1,000 次迭代来减慢哈希的创建速度,以便它可以克服暴力攻击。

定义 Wifi 中使用的 WPA 安全性的 IEEE 802.11i 标准概述了预共享密钥由以下公式定义:

PSK = PBKDF2(PassPhrase, ssid, ssidLength, 4096, 256)

因此,我们看到我们使用了 4,096 次迭代。

WASM 中的编码为:

使用带有 JavaScript 的 WASM 的 PBKDF2 \Bib: @misc{asecuritysite_19466, title = {使用带有 JavaScript 的 WASM 的 PBKDF2}, year={2025}, organization =…\asecuritysite.com

参考资料

Percival, C. (2009). 通过连续内存硬函数实现更强的密钥派生。

使用本文
0
共享
上一篇

快速傅里叶变换(FFT)

下一篇

CertiK联创顾荣辉做客纽交所,剖析Bybit与Coinbase事件暴露的Web3安全新挑战

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

阅读下一页

代币锁和时间锁

代币锁是一种限制代币提取的一种合约。它可以把合约中的代币先锁定一段时间,受益人在锁仓期满后才能发起提现取出代币。时间锁是一种限制合约的行为的特殊合约。