抗ASIC、抗GPU 的密码哈希算法(安全密钥派生)Argon2算法
抗ASIC、抗GPU 的密码哈希算法Argon2算法
背景:现有的算法的问题
Password 一般以 Hash 后的形式存储在数据库中。
加盐已经可以解决大部分问题,但无法阻止 Brute Force Attack,借助 GPU、FPGA、ASIC 等定制硬件可以非常低成本的进行 Hash 计算。此外,如果 salt 和 password 被一起被拖库(甚至代码),会使得破解成本更加低。
这里核心的问题是,Hash 方法使用的是无内存计算的,而 GPU、ASIC 等硬件可以让无内存计算变得非常高效。但是,当一个 Hash 方法需要用到一大块内存去计算的时候,这些硬件就会束手无策。所以 memory-hard hash function 开始被设计和使用。
Memory-hard hash function 也可以被用在加密货币的工作量证明中,用来压制 GPU 和 ASIC 在加密货币中的滥用。例如 [scrypt]被用作莱特币的工作量证明算法。
什么是Argon2
Argon2 是一个现代的 抗ASIC、抗GPU 的安全密钥派生函数。在配置得当、且消耗资源相当的情况下,其相较于 PBKDF2、Bcrypt 和 Scrypt ,有着更强的密码破解抗性。
Argon2 是一种慢哈希函数,在 2015年7月获得 Password Hashing Competition 冠军。它由卢森堡大学的Alex Biryukov、Daniel Dinu和Dmitry Khovratovich设计,利用大量内存计算抵御 GPU 和其他定制硬件的破解,提高哈希结果的安全性。
Argon2算法的核心思想是利用大量的内存和时间资源来抵抗暴力破解和侧信道攻击。。它采用了数据依赖的内存访问模式,使得算法的执行过程不仅与输入数据有关,还与内存中的状态有关。这种设计使得攻击者难以通过预计算或缓存攻击来加速破解过程。
Argon2是一种密钥推导函数(KDF)。KDF的主要作用是将一个或多个密钥作为输入,生成一个或多个新的密钥,这些新的密钥可以用于加密、解密、签名等操作。Argon2的设计目标就是提供一种高效、安全的KDF,以满足现代密码学的需求。
一般来说,Argon2 是最为推荐的 KDF ,优于 Scrypt, Bcrypt 和 PBKDF2。
在实际应用中,Argon2可以广泛应用于哈希凭证存储、密钥派生等领域。例如,在网站注册时,用户输入的密码通常会经过哈希处理后再存储到数据库中。这样即使数据库被泄露,攻击者也无法直接获取到用户的明文密码。而使用Argon2作为哈希函数,可以大大提高密码存储的安全性。
- Argon2d:更快,使用 data-dependent 的内存访问方式,data 是需要 Hash 的 password 和 salt。适合加密货币和不会收到 side-channel timing 攻击的应用。
版本最大限度地抵抗GPU破解攻击,适用于对性能要求较高的场景。 - Argon2i:使用 data-independent 的内存访问方式,更适合密码哈希等。他比 Argon2d 慢,因为它需要更多次内存计算(passes)来保护免受 tradeoff 的攻击。
版本经过优化,能够抵抗侧信道攻击,适用于密码散列。 - Argon2id:是 Argon2i 和 Argon2d 的混合版本,第一次计算用 Argon2i,后续的计算用 Argon2d。如果没有特定的理由,推荐使用 Argon2id。
是一个混合版本,结合了前两者的优点,适用于大多数通用场景,包括密码散列。
这三个版本各有特色,适用于不同的场景。Argon2d主要侧重于防止GPU破解攻击;Argon2i则更注重抵抗侧通道缓存计时攻击;而Argon2id则是Argon2d和Argon2i的混合体,综合了两者的优点,既能抵抗GPU破解攻击,又能抵抗侧通道缓存计时攻击。
Password Hashing Competition
密码学虽然是研究密码的,但是其加密算法是越公开越好,只有公开才能去检视该算法的好坏,只有经过大家的彻底研究,才能够让该算法得以在业界使用和传播。
最出名的密码算法大赛肯定是由NIST在2001年为了指定标准的AES算法举办的大赛,该大赛的目的寻找最新的加密算法来替代老的DES算法。在这次大赛中,涌现了许多优秀的算法,包括CAST-256, CRYPTON, DEAL, DFC, E2, FROG, HPC, LOKI97, MAGENTA, MARS, RC6, Rijndael, SAFER+, Serpent, 和 Twofish等。最终Rijndael算法被选为最终的AES算法实现。
同样的密码哈希竞赛也是一个这样的算法比赛,和NIST举办的算法比赛不同的是,这是一个非官方的,由密码学家们组织的比赛。它是在由Jean-Philippe Aumasson于2012年秋季发起。
该竞赛于 2012 年秋季启动,2013 年第一季度,竞赛委员会发布了征集参赛作品的通知,截止日期为 2014 年 3 月底。作为比赛的一部分,小组成员对提交的参赛作品进行了全面审核,并发布了一份初步的简短报告,其中描述了他们的选择标准和理由。
Argon2 的配置参数
Argon2 有如下几个配置参数,和 Scrypt 很像:
- 密码 P : 要被 hash 的密码(或消息 message );
- 盐 S : 随机生成的盐(用于密码 hash 时,推荐使用 16 字节长度的盐);
- 迭代数 t : 要进行的迭代次数;
- memorySizeKB m : 要使用的内存大小(单位为 kbytes) ;
- parallelism p : 并行程度(即线程数);
- outputKeyLength T : 想要算法返回的字节长度