摘要1. 介绍
2. memory-hard算法
7. scrypt

STRONGER KEY DERIVATION VIA SEQUENTIAL MEMORY-HARD FUNCTIONS

Author: Colin Percival

A strong key derivation function is one which can only be computed by using a large circuit for a long time.

摘要

我将介绍memory-hard算法的概念和有序memory-hard函数,并认为密钥派生为了最大程度地抵御自定义硬件攻击,其应该由有序memory-hard函数构造。我们提出在随机预言模型下的一组密钥派生函数哈希函数的集合,证明是连续的难于存储的,并且变异似乎略强,但缺乏可证明的力量。最后,我们提供了一些执行成本估算暴力破解各种密码强度和密钥派生功能。

1. 介绍

基于口令的密钥派生函数有两个主要的用途:

一,哈希口令以防止攻击者获取口令文件之后立刻得到其中的口令

二,生成用于数据加密和认证的加密密钥

虽然这两种用途在密码学上似乎有很大的不同。在第一种在这种情况下,攻击者拥有口令的哈希值并希望获得口令本身;而在第二种情况下,攻击者拥有经过加密或认证的口令哈希值数据,并希望获得所述口令哈希值。它们实际上是等效的:因为所有的现代密钥派生函数由哈希构成,其没有已知的非平凡预映像攻击众,直接攻击密钥派生函数是不可行的;所以,最好的攻击方法都是遍历所有可能的口令并用密钥派生函数验证。

不幸的是,这种穷举攻击很容易成功。用户常选择那些熵远小于密码学密钥典型要求的口令。最近的一项研究发现,即使对于paypal.com之类的网站也只有很小一部分口令的熵超过64比特[15]。由于这类网站的帐户通常与信用卡和银行帐户相关联,因此其希望用户尽量使用强密码,即口令的平均熵大概为42.02比特。为了增加这种暴力攻击的成本,可以使用一种称为“密钥扩展”或“密钥增强”1 的方法:通过使用密钥派生函数,密钥派生函数要求2s次密码学运算,这使得暴力破解熵有t比特的口令的代价从2t次运算提高到2s + t次运算[19]。

这种方法已被广泛应用多年且越来越受重视。最初的UNIX CRYPT函数(此函数可以追溯到1970年代后期)将DES迭代25次以提高攻击成本[22],而Kamp的基于MD5的哈希[18]对MD5分组密码进行了1000次迭代。最近,Provos和Mazieres的bcrypt [24]以及RSA实验室的PBKDF1和PBKDF2 [17]都有明确说明,bcrypt、PBKDF1和PBKDF2 要去执行用户指定的迭代次数2,迭代次数可能与口令盐值一起存储。

假设,随着计算机系统的使用,迭代次数增长的更快,只要攻击者受限于与合法用户相同的软件实现,就会使得合法用户可以在不断增长的计算能力的情况下,在密钥派生花费固定的时间而不降低安全性。但是,正如Bernstein在整数因式分解的背景下指出的那样[10],相比于软件实现,尽管并行化的硬件实现可能不会改变执行的操作数,这并不能阻止它们显著改变渐近成本,因为在许多情况下,包括并行任务暴力搜索口令字段,美元秒(原文为dollar-seconds)是衡量计算成本的最好度量单位3。随着半导体技术的发展,电路不仅单纯的变快,它也越来越小,从而使得在相同代价的情况下可以执行更多的并行任务。因此,使用现有的密钥派生算法,即使增加了迭代次数,验证口令所花的时间也是常量值,以硬件通过暴力破解查找口令的成本也逐年下降。

这篇论文旨在降低攻击者通过定制的并行电路获得的优势。

memory-hard算法

A memory-hard algorithm on a Random Access Machine is an algorithm which uses S(n) space and T(n) operations, where
hkdf密钥派生java实现 密钥派生函数的应用_迭代

降低攻击者提供的优势的自然方法构建高度并行的电路是为了增加单个密钥派生的大小电路-如果电路的尺寸是电路的两倍,则只能在电路板上放置一半的副本

给定的硅面积-同时仍在软件可用资源内运行实现,包括功能强大的CPU和大量RAM。确实,在第一篇将密钥扩展概念正式化的论文中[19]指出要求“ 32位算术并使用适量的RAM4”会使硬件攻击变得更加昂贵。但是,广泛使用的密钥派生

scrypt

给定连续的memory-hard“混合”函数MF和伪随机函数PRF可以轻松构造强大的密钥派生函数。我们定义函数MFcryptPRF,MF(P,S,N,p,dkLen) 的计算为如下算法:

参数:

  • PRF      伪随机函数
  • hLEN      PRF 输出的伪随机数长度,单位为字节
  • MF       从hkdf密钥派生java实现 密钥派生函数的应用_迭代_02        到 hkdf密钥派生java实现 密钥派生函数的应用_暴力破解_03
  • MFLen      由MF混合的分组长度,单位为字节

输入:

  • P 密码,一个以字节形式输出的字符串
  • S 盐值,一个以字节形式输出的字符串
  • N CPU/memory 代价参数
  • p 并行参数,其为一个正整数且满足hkdf密钥派生java实现 密钥派生函数的应用_暴力破解_04
  • dlLen 分发密钥的预期输出长度,其为一正整数,且满足hkdf密钥派生java实现 密钥派生函数的应用_暴力破解_05

输出

  • DK 被分发的密钥,长度为dkLen字节

步骤:

  1. hkdf密钥派生java实现 密钥派生函数的应用_暴力破解_06
  2. for i=0 to (p-1) do
    hkdf密钥派生java实现 密钥派生函数的应用_hkdf密钥派生java实现_07
    end for
  3. hkdf密钥派生java实现 密钥派生函数的应用_随机函数_08

该算法根据提供的口令和盐值通过伪随机函数PRF的PBKDF2 [17]和来生成p个长度为MFLen字节的块;p个长度为MFLen字节的块分别使用混合函数MF进行各自的混合;将充分混合的p个块作为盐值再次作用PBKDF2得到最终的输出5。因为对于大的N,调用MF比调用PBKDF2会花费更长的渐近时长,并且使用PBKDF2生成的Bi是相互独立且随机的,假设H是随机的,我们注意到,如果MF是有序memory-hard函数,则MFcrypt是随机模型下的有序memory-hard。

现在,我们将MFcrypt应用于上一节中的混合函数SMix和SHA256哈希函数:

定义4: 密钥派生函数scrypt定义为:
hkdf密钥派生java实现 密钥派生函数的应用_迭代_09

scrypt的用户可以根据计算机的内存大小、计算能力、内存子系统的带宽延迟和并行任务数量来调整N,r和p参数。目前,取r = 8,p = 1似乎会产生很好的结果,但是随着内存延迟减小、CPU并行性增加,r和p的最佳值将增大。还要注意的是,由于SMix的计算是独立的,在不增加内存使用的情况下大数p可用于增加scrypt的计算成本。因此,即使CPU计算能力和内存容量的增长率不一样,我们预期scrypt仍然有用。

猜想1. 如果电路少于t时间内不能计算出Salsa20 / 8核,对于任意的x>=0, 电路不能在小于sx区域中存储x比特数据,则电路不能用预期摊销时区域计算scrypt(P,S,N,r,p,dkLen)每个小于```1024N2r2pst的口令。

简而言之,这种猜想表明,相比于计算ROMix的“通用”算法,将ROMix,BlockMix,Salsa20 / 8核联合使用不会使scrypt遭受任何攻击。

附录

1. The phrase “key strengthening” was introduced by Abadi et al. [8] to refer to the process of adding additional entropy to a password in the form of a random suffix and verifying a password by conducting a brute-force search of possible suffixes; but the phrase is now widely used to mean the same thing as “key stretching”. ↩︎
2. It should be noted, however, that when used to verify login passwords, the “user-defined” value is typically stored in a system configuration file which the vast majority of users never modify. ↩︎
3. That is, the price of hardware times the amount of time for which it needs to be used; this is analogous to the common AT (area times time) cost measure used in the context of VLSI circuit design. The ability of parallel designs to achieve a lower cost for the same number of operations is essentially due to their ability to use a larger fraction of die area for computational circuits. ↩︎
4. The example given is 256 32-bit words, which hardly qualifies as “moderately large” at the present time, and is questionable even in the context of hardware of the time (1997) given that even low-end PCs rarely had less than 4 MB of RAM (that being the official minimum requirement to run the Windows 95 operating system). ↩︎
5. 16 ↩︎