跳转到内容

密码学/安全密码

来自维基教科书,开放世界中的开放书籍

一个严肃的密码系统不应该基于隐藏的算法,而应该基于难以猜到的隐藏密码(参见《基本设计原则》部分中的柯克霍夫法则)。如今,密码非常重要,因为访问互联网上的大量门户网站,甚至你的电子邮件帐户,都限制在那些能够提供正确密码的人。这通常涉及人类在选择、记忆和使用密码方面的参与。所有三个方面通常都是弱点:众所周知,人类在选择难以破解的密码方面很糟糕,[1] 难以记住强密码,并且在使用密码时马虎且过于信任。基于已知项目的密码几乎是不可抗拒的诱惑。同样,我们能很好地记住简单的(例如短的)或熟悉的(例如电话号码)密码,但大多数人无法可靠地记住更强的密码;这会导致不安全性,因为需要简单的方法来恢复密码,甚至绕过密码。这些方法普遍不安全。最后,人类很容易成为网络钓鱼欺诈骗局、肩窥、帮助忘记密码的朋友等的受害者。

但是,密码必须保护访问和消息免受除人类攻击者以外的攻击。有很多基于机器的方式来攻击密码算法和密码系统,因此密码也应该难以自动攻击。为了防止一类重要的自动攻击(暴力搜索),密码必须让坏人难以猜测。 密码应既长(单字符密码很容易被猜到,很明显)且理想情况下应该是随机的——也就是说,没有任何模式。足够长的密码将需要如此多的机器时间,以至于对于攻击者来说是不切实际的。没有模式的密码不会为暴力搜索提供任何捷径。 这些考虑因素表明密码应该具有一些属性

  • 长度足够长,以防止暴力搜索(截至 2010 年的常见建议至少为 8 个字符,如果不允许任何一类字符(例如,不允许使用小写字母或不允许使用非字母数字字符等),则需要更长的密码;如果密码应该在未来保持不可破解(当计算机速度更快,暴力搜索更有效时),则需要更长的密码)
  • 不包含姓名(宠物、朋友、亲戚等)、任何字典中找不到的单词、任何引语集中找不到的短语
  • 不包含个人相关的数字或信息(电话号码、地址、生日)

密码处理

[编辑 | 编辑源代码]
密码处理同时是密码学中为数不多的已解决问题之一,*也是*最容易被误解的问题之一。

任何将用户密码以明文形式存储在某个文件或数据库中的 Web 服务器,都是做错了。[2][3][4][5][6]

出于显而易见的原因,密码通常不会以明文形式存储,而是以摘要形式存储。为了验证用户身份,用户提供的密码会被加盐、哈希,并与存储的哈希进行比较。[7]

PBKDF2 最初设计用于“从密码生成加密密钥”,但事实证明它很适合为安全存储和身份验证目的生成密码摘要。[8][9]

2013 年,由于只有 3 种算法可用于为安全存储和身份验证目的生成密码摘要——PBKDF2、bcrypt 和 scrypt[6]——2013 年,密码哈希竞赛 (PHC) 宣布成立。[10][11][12][13]

密码哈希算法

[编辑 | 编辑源代码]
Clipboard

待办事项
提及一些历史上的密码哈希算法,例如 维基百科:George B. Purdy 的 Purdy 多项式;传统的基于 DES 的方案,它将用户的密码截断为 8 个字符;并简要介绍一下 维基百科:Crypt (C) 如何使过渡到新的密码哈希算法变得更容易。


密码哈希算法与其他密码哈希算法之间的主要区别在于,密码哈希算法应该让拥有大规模并行 GPU 和 FPGA 的攻击者难以从存储的密码摘要中恢复密码——即使密码相对较弱。实现此目的最常见的方法是设计算法,使这种攻击者恢复弱密码所需的时间远远超过授权服务器在获得正确密码后验证密码是否正确所需的时间。

密码验证实用程序 passwd 使用秘密密码和非秘密盐,使用 crypt (C) 库生成密码哈希摘要,该库反过来使用许多密码哈希算法。

通常,单个阴影密码文件存储由几种不同的哈希算法生成的密码哈希摘要。使用的特定哈希算法可以通过结果哈希文本中的唯一代码前缀来识别,该前缀遵循名为模块化密码格式的伪标准。[14][15][16]

任何可用的 哈希算法 都远远优于简单地将密码存储为明文;或存储可快速解密以恢复原始密码的“加密”密码的令人羞愧的做法。[17]

不幸的是,实际上所有可用的哈希算法最初并不是为密码哈希而设计的。

虽然 SHA-2SHA-3 的一些迭代对于计算文件验证摘要、消息认证 代码或应用于长文件的 数字签名 已经足够了,但当应用于短密码时,即使迭代十几次,它们也容易破解。实际上,截至 2013 年,所有可用的哈希算法要么是

(a) 已经知道使用基于 GPU 的蛮力 密码破解 工具相对容易破解(恢复弱密码),或者 (b) 太新了,或者还没有被充分研究,因此尚不清楚是否容易破解。[18]

例如,已经构建了能够从任何 Windows XP LM 哈希或 6 个可打印字符密码中恢复有效密码的系统,最长 6 分钟即可完成。[19][20] 并且能够从 NTLM 哈希中恢复任何 8 个可打印字符密码,最长 5.5 小时即可完成。[19]

例如,已经构建了能够遍历可能的单词字典和常见的“黑客语”替换[20] 的系统,以便以 180 Ghashes/秒的速度恢复生成某个给定 MD5 哈希的密码[21],或者以 73 Mhashes/秒的速度恢复生成某个给定 DEC crypt() 摘要的密码[22]

一种名为“密钥拉伸”的技术可以使密钥搜索攻击的成本更高。[23]

进一步阅读

[编辑 | 编辑源代码]
  1. Burr、Dodson、Polk。“电子认证指南:美国国家标准与技术研究院建议”第 A.2.2 节“最小熵估计”:“经验表明,相当一部分用户会选择非常容易猜到的密码(“password”可能是最常见的密码,只要允许)。 ”[1]
  2. http://plaintextoffenders.com/
  3. http://crypto.stackexchange.com/tags/passwords/info
  4. http://security.stackexchange.com/questions/17979/is-sending-password-to-user-email-secure
  5. http://security.stackexchange.com/tags/passwords/info
  6. a b Adam Bard。"存储密码的 3 种错误方法:以及 5 个正确的代码示例"。2013 年。
  7. "如何安全地哈希密码?"
  8. "NIST 是否真的推荐使用 PBKDF2 进行密码哈希?"
  9. "使用 PBKDF2 进行哈希安全吗?"
  10. http://crypto.stackexchange.com/questions/12795/why-do-i-need-to-add-the-original-salt-to-each-hash-iteration-of-a-password
  11. "提高已存储密码哈希的安全级别"。引用:“一项新的密码哈希算法公开竞赛已经启动,采用了之前的 AES、eSTREAM 和 SHA-3 竞赛的模式。提交截止日期为 2014 年 1 月底。”
  12. "密码哈希竞赛"
  13. "除了 bcrypt 和 scrypt,还有更现代的密码哈希方法吗?"
  14. Simson Garfinkel、Alan Schwartz、Gene Spafford。"Practical Unix & Internet Security"。2003 年。“4.3.2.3 crypt16( )、DES 扩展和模块化密码格式”部分。“模块化密码格式 (MCF) 指定了一种可扩展的加密密码格式方案。MCF 是最流行的加密密码格式之一。”
  15. "模块化密码格式:或,关于非标准的附注"
  16. "二进制模块化密码格式"
  17. "纯文本攻击者"
  18. Dennis Fisher。"密码学家旨在寻找新的密码哈希算法"。2013 年。
  19. a b Paul Roberts。"更新:新的 25 GPU 怪物在几秒钟内吞噬密码"。2012 年。
  20. a b Dan Goodin "黑客剖析:即使你的“复杂”密码也很容易破解"。2013 年。
  21. Jeremi M. Gosney。"密码破解 HPC"。2012 年。
  22. "John the Ripper 基准测试"
  23. Arnold Reinhold。"HEKS:密钥拉伸算法系列"。1999 年。
华夏公益教科书