Basics in Cryptography: What is a password hash?

什么是密码?

密码已经成为技术世界和日常语言的主流。从您的电子邮件账户到关于埋藏宝藏的儿童故事书,对密码的要求已经司空见惯,以至于我们很少考虑密码到底是什么,更不用说密码散列了。

NIST对密码的技术定义是:“一串字符(字母、数字和其他符号),用于验证身份、验证访问授权或获取加密密钥。我们都非常熟悉如何输入密码来访问自己喜欢的网站和账户,但如何安全地保存这些凭据就比较棘手了。

作为用户,绝不重复使用密码、始终选择强密码并确保不时更改密码至关重要。在所有账户中创建和使用唯一且安全的密码的一种方法是使用密码管理器。将密码管理器纳入个人隐私保护措施,你就已经比尚未采取这一必要步骤的大量互联网用户更加安全了。

遗憾的是,您无法百分之百地保护自己,因为您注册的服务会处理您的登录凭据。这就是数据泄露的原因。我们已经非常熟悉新闻报道中所说的 “数据泄露包括用户名、出生日期、电子邮件地址、电话号码和密码哈希值”。虽然这些术语大多容易理解,但最后一个可能会引起混淆。为了澄清这一点,让我们来看看公司和在线服务究竟是如何处理您在创建新账户时提交的数据的。

安全存储密码的问题。

想象一下,你是一家不断发展壮大的在线论坛,随着越来越多的人抢着注册你的服务,你需要确定一种安全的方法来保证用户登录信息的安全。毕竟,如果有人窃取了他们的登录信息,您的用户就会不高兴。

为了更好地理解这一点,让我们来看看当你尝试登录你喜欢的网站时到底会发生什么。首先,您在浏览器中访问登录页面,系统会提示您输入用户名/电子邮件地址和密码。输入这些信息后,点击 “登录”。接下来的事情就有点复杂了。

在选择密码时,密码不会(希望)以明文形式存储在相关服务中。如果服务以明文形式存储密码,那么一旦服务受到威胁,就有可能暴露您的登录凭据。相反,您选择的密码应该进行散列处理,散列值应存储在服务运营的安全数据库中。当您登录新账户时,您提交的电子邮件地址和密码哈希值会与数据库中存储的信息进行比较。由于这些信息是匹配的,因此您就可以访问该账户了。但是,黑客只能获得他们无法使用的哈希值,无法登录您的账户。

Tuta,我们使用 Argon2来获取解锁加密数据的密钥(密码密钥)。当我们从 bycrypt 转向 argon2 时,我们还将生成密钥的长度增加到 256 位,使其也成为后量子安全密钥。密码密钥不用于在 Tuta 服务器上验证您的身份,而是使用 SHA256 对其进行散列,使其成为密码验证器,然后传输到服务器,并在存储到数据库之前再次散列。有关 Tuta 如何确保密码安全的更多详情,请点击此处

A visualization of how we handle passwords and encryption keys.

那么,是什么使得存储哈希值比存储明文密码更安全呢?答案很简单,就是在发生泄密事件时提供额外保护。

什么是密码散列?

密码散列是将用户创建的密码通过散列算法进行散乱处理,从而创建所选密码的唯一表示。如果不知道密码,最好就无法复制完全相同的哈希值。

散列算法有多种类型,但它们都执行类似的功能。它们采用明文密码,明文密码被视为任意长度的数据字符串(想想你的密码的不同长度),然后根据所使用的散列函数将该字符串转换为数据位,这些数据位被确定性地扰乱(这意味着相同的密码将始终产生相同的散列)。然后将哈希值存储在安全数据库中。

重要的是要记住,散列与加密不同。没有密钥可以解密散列。散列是一种单向传输方式,只能从明文传输到散列。对于有烹饪爱好的人来说,让我们以马铃薯为例。去皮的马铃薯就是我们的明文,一旦我们对它进行散列,把它变成一盘美味的薯饼,这就是我们的散列。就像你不能把土豆饼变回原来的土豆一样,你也不能把散列变回原来的密码。

Hashing functions are a one-way street

散列函数是单向的。与加密不同,哈希函数返回原始明文时不会生成密钥。

当有人谈论破解密码时,他们并不是在 “解密 “任何东西,而是根据常用密码创建自己的散列列表,然后将已知结果与数据泄露中泄露的信息进行比较。这就变成了一个相互参照的问题,不需要深厚的密码分析知识,只需要基本的逻辑即可。

什么是加盐密码哈希值?

前面我们谈到了加盐散列。加盐是在哈希算法处理输入之前,在输入中添加随机数据的过程。由于每个密码的盐值都是唯一的,这就可以防止利用预计算哈希值的攻击,因为即使盐值包含在数据泄露中,攻击者也必须为每个单独的盐值进行预计算,这使得攻击的成本大大增加。此外,如果不对密码进行加盐处理,如果你和我使用相同的密码,由于密码哈希算法的确定性,数据库中的哈希值也会显示相同。通过加盐,我们最终会得到不同的输出结果,从而防止黑客迅速找出密码相同的账户。

An example of the difference between hashed passwords with and without salting.

加盐不仅能让食物更美味,还能增强密码散列的强度!

加密盐可以从用户名或其他每个账户特有的唯一标识符中提取。在这里,唯一性是关键,因为它使得使用预计算表攻击所需的资源远远超出合理范围。

问题和攻击类型

当然,哈希算法并不完美,但密码学家在创建这些函数时,会考虑到一些已知的攻击。

生日攻击

每种密码散列算法都容易受到一种称为生日攻击的攻击。这些攻击利用了一个数学概率问题,即生日问题。关于这一问题背后的数学原理,请点击此处。幸运的是,这些攻击并不比暴力破解更快。

碰撞攻击

当两个不同的密码(明文字符串)通过哈希算法运行并返回匹配的哈希值时,就会发生碰撞攻击。这是有问题的,因为它意味着一个错误的密码与正确的用户名相结合,就可能导致登录成功。

如果发现碰撞攻击比生日攻击更快、更有效,那么密码散列函数就会被认为是坏的,应该换成更有弹性的算法。

暴力攻击

暴力攻击是每个密码系统都存在的潜在漏洞。只要有无限的时间和无限的计算能力,就能发现哈希值。正因为如此,它们被认为是检验其他漏洞严重性的试金石。如果确定某种攻击比暴力破解更快,就必须修补或放弃相关算法。

流行的散列函数

目前已开发出多种密码散列算法,它们各有自己独特的优缺点。不幸的是,一些最流行的散列算法已被证明存在漏洞,但它们仍被经常使用(如 YouTube 上的视频解释的),而且经常出现在漏洞数据集中。

  1. MD5 :被认为是一种早已过时的算法,但当新的漏洞数据集出现在公众面前时,这种散列函数仍然经常出现。MD5 由麻省理工学院教授 Ronald Rivest 于 1991 年开发,是 MD4 的替代品。它能产生 128 位的散列,但很快就被证明容易受到碰撞攻击。2013 年,研究人员证明该算法不再安全,应予以取代。不幸的是,MD5 哈希值不断出现在数据泄露事件中,这意味着您的数据可能因您自己的过失而暴露。
  2. SHA 算法替代 MD5 的推荐算法是安全散列算法系列的散列函数。SHA-1 由美国国家安全局开发,于 1995 年推出,可生成 160 位的哈希值。2005 年,该算法被认为对高级威胁行为者不安全,这对用于创建数字签名以验证真实性的情况构成了特别威胁。在此之前,SHA-2 于 2001 年发布,并于 2011 年在 NIST 推出新的最低安全要求时正式取代其前身。遗憾的是,由于缺乏向后兼容性,SHA-2 的推出速度放缓。最近,SHA-3 于 2015 年发布,其结构与之前与 MD5 类似的迭代版本完全不同。SHA-2 和 SHA-3 都支持 256 到 512 位的哈希长度,具体取决于所选的设置。
  3. bcrypt :bcrypt 于 1999 年推出,是一种密码散列算法,引入了默认加盐和自适应功能。这意味着随着时间的推移,它可以继续抵御暴力破解攻击。Bcrypt 基于布鲁斯-施耐尔开发的 Blowfish 密码。
  4. Argon2 :Argon2 是 2015 年密码破解竞赛的冠军。它不仅具有抗侧信道的能力,而且还具有内存硬度,这使得它比 bcrypt 更能抵御暴力破解攻击。

在 Tuta,我们正在引领安全和隐私领域的发展。采用 Argon2 后,我们成为首家使用目前最强大的密钥推导技术的电子邮件提供商。通过将密码学和安全性放在首位,我们正在建立您可以信赖的隐私。结合我们的零知识架构,我们无法获得解密或查看数据所需的密钥。您的隐私尽在掌握。

今天就切换到 Tuta并开启隐私功能,重新掌控您的数据。