Protogalaxy

Planet #0

PHSS-Core开发日志#6 密码加密算法对比

在互联网发展的初期,密码大多是以明文存储的,因为密码被认为是安全的,它需要凭证才能够被访问到。但是,攻击者可以通过SQL注入等攻击方式来获取大量的密码。随着越来越多的密码被这些攻击手段所获取,安全领域的专家们开始意识到需要一中更加安全的方式来保护用户的密码。

随后,安全领域开始鼓励开发人员使用单向散列算法(也称Hash算法,例如SHA256)来将密码进行加密存储。当用户尝试认证时,系统将用户上传的密码hash后与数据库中储存的hash值进行比较,这意味着数据库只需存储密码的单向散列。如果系统被攻破,也只会暴露密码的单向散列,由于在计算上很难通过单向散列值来破解密码,因此这种方法在很大程度上提高了密码的安全性。但是随着黑客技术的发展,攻击者也开始使用彩虹表(Rainbow Tables)来辅助破解,攻击者并不是每次都是在猜测密码,而是通过彩虹表来使用“以空间换时间”的策略来进行密码破解。

为了有效降低彩虹表的破解效率,安全人员开始使用Salted Passwords,即加盐加密的密码,使用随机的盐来进行加密,这意味着彩虹表的效率得到了有效的降低吗,因为不同的盐与密码的组合而形成的哈希值都不尽相同。

在现代,随着计算设备算力的不断提升,我们发现hash计算不再安全,因为现代计算设备每秒可以执行数十亿次的hash运算,这意味着使用hash算法进行加密的密码可以在很短时间内被破解。

所以在现代,我们选择使用自适应单向函数来存储密码,使用自适应单项函数对密码进行验证是有意识的对系统资源进行短时间占用。自适应单项函数允许配置与硬件相符的“工作环境”,一般是将函数调整为在系统上验证密码需要大约1秒的时间,这种权衡是为了在可接受的开销下让攻击者更加难以破解密码。常见的自适应单向加密算法有bcrypt,PBKDF2,scrypt与Argon2.

1.PBKDF2

PBKDF2是个非常简单的函数,它通过参数指定的迭代次数进行HMAC运算,因为GPU与CPU有着不同的设计,所以当PBKDF2在CPU上工作困难时,它可以在GPU上有着更好的表现。

2.bcrypt

一种具有长久历史的CPU与RAM密集型的加密算法,对GPU-ASIC攻击具有良好的防御性,但对于FPGA来说没什么作用。

3.scrypt

scrypt自2009年以来解决了FPGA的问题,因为它不仅使用了exponential time,还使用了exponential memory。

参考自scrypt论文:破解密码所需的时间

4.Argon2

一种新的密码Hash算法,它是PHC(Password Hashing Competition)的获胜者。Argon2总结了memory-hard的各种设计方式,可以用来进行密码hash储存。它有一个简单的设计用来提高内存填充速率与多核运算效率。

在上面这四个算法中,经过查询与对比,我最终选择了bcrypt,理由有如下三点:

  1. 它已经经过了安全社区的审查,因为它现在已经走过了第15个年头
  2. 它在该领域已经经过了15年的考验,并且现在依然在发展
  3. 它被广泛使用,并且得到了有效的支持

发表评论