encryption - 密码处理最佳实践?

标签 encryption passwords

我们有许多网络服务和网络应用程序以不同的方式对用户进行身份验证,其中一些出于非常糟糕的技术原因而具有不同的密码要求。例如,一个系统拒绝 $ 符号,直到有人“修复”某些 Perl 脚本中的字符串处理。另一个系统似乎可以解析密码中的 @ 符号。另一个系统向用户颁发密码,开发人员很自豪地向我展示这是用户名的可逆转换。

我知道密码哈希是首选;但我想知道在过渡到基于浏览器的软件过程中必须牺牲多少。为了我自己的启发,并提出改变的理由,是否有关于密码处理和管理主题的权威引用资料,我可以向我的部门和负责其他服务的人员展示?

最佳答案

对密码中允许使用的字符设置的限制越少越好 - 它会增加尝试暴力破解的人的搜索空间。理想情况下,没有理由禁止密码中包含任何 ASCII 字符(除了控制字符和退格/换行符之外)。

就长度限制而言,最小限制是好的(在某种程度上 - 例如,不要通过将最小长度设置为 10 来激怒用户),最大限制则不好。如果有人想要一个 50 个字符的密码,就让他们吧 - 只要您进行散列,存储就不应该成为问题,因为散列的长度是恒定的。

始终以不可逆的哈希形式存储密码 - 理想情况下,是一种加密安全的形式。没有理由以可逆的形式存储它们(如果有人忘记了密码,只需为他们设置一个新密码,不要尝试“检索”它)。不要编写自己的散列算法 - 您很可能不是密码学专家,并且有很多好的、经过验证的散列算法及其实现(以代码或库形式)仅用于关于任何主流语言。

使用足够长度的每用户盐对哈希值进行加盐,以防止 rainbow table开裂。

Pro PHP Security 中的第 5 章和第 6 章涉及密码的存储和加密:

一些相关文章:

关于encryption - 密码处理最佳实践?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1246463/

相关文章:

Azure B2C 注册流密码验证缺少失败文本

java - 在 AES/CBC/PKCS5Padding 中获取 'BadPaddingException: pad block corrupted'

java - 移位密码错误地移位了一些字符

command-line - 调用tf.exe时如何记住用户名/密码?

android - 如何安全地存储 Android KeyStore 密码

java - 比较 Liferay 的加密密码和用户输入

c# - 在 Windows 应用商店应用程序中加密和解密本地镜像

delphi - Base64_to_stream Turbo power Lockbox 3.6.2 Delphi Xe7 | Base64_to_stream Turbo power Lockbox 3.6.2 Delphi Xe7 E2010 不兼容类型 : 'System.TArray<System.Byte>' and 'string'

php - 适用于 PHP 的 AWS 开发工具包 - 解密密码

php - PHP 中用于密码存储的最慢哈希函数?