Dropbox是如何安全地存储用户密码

原文:How Dropbox securely stores your passwords
作者:Devdatta Akhawe
翻译:黑色巧克力

译者注:加密和**是一场永不停止的战争,本文作者公开了Dropbox为保护用户密码安全所采取的措施,并对实现细节进行了描述,下面请看译文。

人们普遍认为存储明文密码是个坏主意。如果一个包含明文密码的数据库被破坏了,那么用户帐户就处于危险之中。因此,早在1976年,计算机行业就开始使用安全的单向散列机制(从Unix Crypt开始)来存储密码。不幸的是,虽然阻止了对密码的直接读取,但所有的散列机制都必然允许攻击者通过使用可能的密码列表,将其哈希并对结果进行比较。在这种情况下,像SHA这样的安全哈希函数对于密码哈希有一个关键的缺陷:它们被设计得太快。一个现代的商用CPU每秒可以生成数百万的SHA256散列,而专门的GPU集群允许以每秒十亿的速度计算散列。

多年以来,Dropbox保持领先于坏人的努力,一直在默默地更新密码哈希方法。在这篇文章中,将分享当前密码存储机制的更多细节,以及背后的原理。Dropbox加密机制构建在三层加密基础之上,如下图所示。为了便于说明,图片和下面的内容省略了任何二进制编码(base64)。


Dropbox是如何安全地存储用户密码


密码的多层保护

Dropbox将bcrypt作为核心哈希算法,使用每个用户的盐和一个加***(或全球胡椒),并将它们分开存储。该方法与基本的bcrypt相比,在一些关键点上大不相同。

首先,明文密码被转换成使用SHA512的散列值。这涉及到bcrypt的两个特殊问题。bcrypt有一些实现是将输入截断为72字节,从而降低了密码的熵值。而其他实现没有截断输入,允许输入任意长的密码,因此很容易受到DoS攻击。通过运用SHA,可以快速将非常长的密码转换成一个固定长度的512位值,从而避免了上述的两个问题。

接下来,这个SHA512散列将再次使用bcrypt,bcrypt散列算法是一种加盐(salt)散列算法,每个密码都有不同的“盐”。与像SHA这样的加密哈希函数不同,bcrypt设计的速度很慢,这样很难通过定制硬件和GPUs(图形处理器)来加速**。crypt散列使用了成本因子10(每个因子相当于每一步计算需要耗费100毫秒的时间),这样就更是加大了暴力**的难度。

最后,对bcrypt散列的结果使用AES256进行加密,通过使用一个Dropbox称之为“胡椒”的秘***(所有散列的常见的)。胡椒是一种深度防御,它的值是单独存储的,这使得攻击者很难发现它(也就是说不在数据库表中)。因此如果密码存储被破坏,没有这些胡椒,对攻击者而言也是没有用的。

为什么不使用{scrypt,argon2}而是bcrypt?

Dropbox考虑过使用scrypt,但使用bcrypt经验更丰富。关于哪种算法更好的争论还在继续,大多数安全专家一致认为scrypt和bcrypt提供了相似的保护。

Dropbox正在考虑使用argon2进行下一次升级:当转移到当前的计划时,argon2还没有赢得密码哈希的竞争。此外,虽然argon2是一个神奇的密码散列函数,但bcrypt自1999年以来就一直存在,没有发现任何重大漏洞。

为什么全球胡椒用于加密而不是哈希?

回想一下,全球胡椒是一种深度防御,通常将其分开存放。但单独存储的话意味着必须包括胡椒的可能性(而不是密码散列)。如果使用全球胡椒来进行哈希,不容易旋转它。相反,使用它进行加密却提供了类似的安全性,也增加了旋转的能力。这个加密函数的输入是随机的,但也包括一个随机初始化向量(IV)。

放眼未来,Dropbox考虑在硬件安全模块(HSM)中存储全球胡椒。在计划的规模上,这是一项相当复杂的任务,但会大大减少胡椒**的可能性。Dropbox还计划在下一次更新中增加bcrypt的强度。

前进

相信使用SHA512,加上bcrypt和AES256是目前最强大和最有效的保护密码的方法。与此同时攻击者正在不断的进化,防御也将会如此。密码散列程序只是用来保护Dropbox的众多措施之一。Dropbox已经对网络暴力攻击采取了额外的防护措施,比如限速口令、验证码和一系列缓解滥用的方法。正如上面的图表一样,有许多层可以保持强大的安全性措施,Dropbox正在积极地投资于它们。