像Argon2这样的密钥派生函数的全部目的是增加创建密钥所需的时间(困难),并且作为副作用,增加攻击密钥所需的资源。
其他关键函数(如PBKDF2 )的问题是,您只能设置所需的总迭代,虽然这对许多应用程序来说都很好,但对于密码哈希并不理想。通过使用特定的设备,PBKDF2可以很容易地快速散列。显卡被设计成能够执行相对较快的重复动作。这使得散列成为一个简单的任务,允许GPU快速通过。然而,虽然GPU可以访问许多逻辑处理器,但它们对快速内存的访问非常有限。
Argon2在设计时考虑到了这一点,允许在硬件中最好地启用三个不同的参数。因此,它有三个不同的可调整因素(称为成本):
- 迭代:总时间成本,要求Argon2在接收输出之前运行一定数量的时间,允许您调整生成输出所需的时间。
- 内存:系统资源成本。内存指定为哈希函数的每个运行实例所需的设置数量。与迭代不同,内存不是可以优化的东西,它是一个物理限制,需要一定数量的可用物理内存(通常是RAM),并且可以免费散列。除非未来发生高速存储密度革命,否则这将是你付出的最沉重的代价之一。
- 并行性:为产生输出而同时运行的线程总数。如果您有大量可用的逻辑处理器,则增加此成本需要攻击者一次处理不太一致的攻击,或者购买更昂贵的设备。
(还需要注意的是,除了列出的输入之外,还有几个不同的输入,但这些输入大多用于Argon2lib的低级别API使用,可以找到这里)。
配置Argon2成本的快速指南:
- 让你的内存成本尽可能高,你可以舒适地支持。如果您最多希望有10个用户同时登录到一个专用服务器上,并且总共有20个GBs内存可用,那么每个函数运行总共需要1.5个GBs。此外,请始终记住要保持良好的扩展性:如果您有20 in的内存,并且当前任何给定时间只有10个用户登录,但您希望将来每次登录超过100个,那么设置您的参数以支持这样的事件。
- 根据您的硬件支持的内容设置您的并行性。我有一台4核心计算机,因此,我将KeePass的并行性设置为4个线程,您的需求将根据每秒的总登录数和硬件所能完成的功能而变化。
- 根据应用程序的不同,将迭代设置为合理的时间。从10这样的低值开始,运行函数,看看接收输出需要多长时间,如果感觉太快,增加迭代次数。继续重复这个过程,直到调整好为止。您将希望根据应用程序的需要设置迭代。如果您正在为您的web服务上的客户端执行密码散列,您可能希望每个散列的目标是0.2秒。但是,如果您正在为本地存储加密进行客户端哈希运算,您可能希望目标为几秒钟,因为您很可能一次只运行一个函数,并且一天只运行几次。
希望这能帮上忙,我给你解释得很好!