- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
目前,据说MD5部分不安全。考虑到这一点,我想知道使用哪种机制进行密码保护。
这个问题,Is “double hashing” a password less secure than just hashing it once?
说明多次散列可能是个好主意,而How to implement password protection for individual files?建议使用salt。
我正在使用PHP。我想要一个安全,快速的密码加密系统。将密码哈希一百万次可能更安全,但也更慢。如何在速度和安全性之间取得良好的平衡?另外,我希望结果具有恒定数量的字符。
哈希机制必须在PHP中可用
必须安全
它可以使用盐(在这种情况下,所有盐都一样好吗?是否有任何方法可以生成优质盐?)
另外,我是否应该在数据库中存储两个字段(例如,一个使用MD5,另一个使用SHA)?它会使它更安全或更不安全吗?
如果我不太清楚,我想知道要使用哪个哈希函数以及如何选择合适的盐,以便拥有安全快速的密码保护机制。
尚未完全涵盖我的问题的相关问题:
What's the difference between SHA and MD5 in PHP
Simple Password Encryption
Secure methods of storing keys, passwords for asp.net
How would you implement salted passwords in Tomcat 5.5
最佳答案
免责声明:此答案写于2008年。
从那时起,PHP就给了我们password_hash
和password_verify
,并且自从引入以来,它们就是推荐的密码哈希和检查方法。
答案的理论仍然是一个很好的阅读。
TL; DR
不要
不要限制用户可以输入哪些字符作为密码。只有白痴这样做。
不要限制密码的长度。如果您的用户想要一个句子,其中包含超级校准,简单易懂的句子,请不要阻止他们使用它。
不要在密码中剥离或转义HTML和特殊字符。
切勿将用户密码以纯文本格式存储。
除非用户忘记了密码,否则切勿将密码通过电子邮件发送给您的用户,而是您发送了临时密码。
永远不要以任何方式记录密码。
切勿使用SHA1或MD5甚至SHA256哈希密码! Modern crackers可以分别超过60和1800亿个哈希/秒。
请勿混用bcrypt and with the raw output of hash(),请使用十六进制输出或base64_encode。 (这适用于其中可能包含流氓\0
的任何输入,这会严重削弱安全性。)
多斯
尽可能使用scrypt;如果不能,请使用bcrypt。
如果不能使用带有SHA2散列的bcrypt或scrypt,请使用PBKDF2。
数据库受到威胁时,请重置每个人的密码。
实现合理的8-10个字符的最小长度,并要求至少1个大写字母,1个小写字母,一个数字和一个符号。这将改善密码的熵,从而使其更难以破解。 (有关一些辩论,请参见“什么才是好的密码?”部分。)
为什么仍要哈希密码?
哈希密码的目的很简单:通过破坏数据库来防止对用户帐户的恶意访问。因此,密码哈希的目的是通过花费大量时间或金钱来计算纯文本密码,从而阻止黑客或黑客。时间/成本是您武器库中最好的威慑力量。
您想要对用户帐户进行良好而可靠的哈希处理的另一个原因是,给您足够的时间来更改系统中的所有密码。如果您的数据库遭到破坏,您将需要足够的时间至少锁定系统,如果不更改数据库中的每个密码。
Whitehat Security的首席技术官Jeremiah Grossman在最近一次密码恢复后强行破解了他的密码保护:
有趣的是,在摆脱这场噩梦的过程中,我学到了很多我不知道的关于密码破解,存储和复杂性的信息。我已经开始欣赏为什么密码存储比密码复杂性重要得多了。如果您不知道密码的存储方式,那么您真正需要依靠的就是复杂性。这可能是密码和加密专家的常识,但是对于普通的InfoSec或Web安全专家而言,我对此表示高度怀疑。
(强调我的。)
无论如何,什么才是好的密码?
stated on White Hat Security blog。 (并不是我完全赞同兰德尔的观点。)
简而言之,熵就是密码中的变化量。当密码仅是小写罗马字母时,则只有26个字符。差异不大。字母数字密码最好使用36个字符。但是允许带符号的大写和小写字母约为96个字符。这比仅字母要好得多。一个问题是,为了使密码令人难忘,我们插入了模式-从而减少了熵。糟糕!
密码熵很容易Entropy。使用整个范围的ascii字符(大约96个可键入字符),每个字符的熵为6.6,而对于8个字符的密码,它的熵仍然太低(熵的52.679位),对于将来的安全性而言太低了。但好消息是:更长的密码以及带有unicode字符的密码,确实增加了密码的熵并使其更难以破解。
approximated站点上关于密码熵的讨论更长。良好的Google搜索也会带来很多结果。
在我与@popnoodles交谈的评论中,他指出强制X长度为X的密码策略包含X个字母,数字,符号等,实际上可以通过使密码方案更可预测来减少熵。我同意。随机性,尽可能真正地随机性,始终是最安全但最难忘的解决方案。
据我所知,使世界上最好的密码是Catch-22。它不是令人难忘,太可预测,太短,太多的Unicode字符(在Windows /移动设备上很难键入),太长的时间等等。没有任何密码能真正满足我们的目的,因此我们必须像保护它们一样保护它们在诺克斯堡。
最佳实务
Bcrypt和Crypto StackExchange是当前的最佳实践。 scrypt在时间上会比bcrypt更好,但是它尚未被Linux / Unix或Web服务器视为采用标准,并且尚未对其算法进行深入审查。但是,该算法的未来看起来确实很有希望。如果您使用的是Ruby,则有一个Scrypt可以帮助您,Node.js现在拥有自己的scrypt gem包。您可以通过scrypt扩展名或Scrypt扩展名(在PECL中都可用)在PHP中使用Scrypt。
我强烈建议您阅读Libsodium的文档,如果您想了解如何使用bcrypt,或者自己找到crypt function good或使用wrapper之类的东西来实现更传统的实现。我建议至少12轮bcrypt,如果不是15到18。
当我了解到bcrypt仅使用河豚的密钥计划以及可变成本机制时,我改变了主意。后者使您可以通过增加河豚的本已昂贵的密钥计划来增加暴力破解密码的成本。
一般做法
我几乎无法想象这种情况了。 PHPASS支持PHP 3.0.18到5.3,因此几乎可以在所有可以想到的安装中使用它-如果不确定您的环境是否支持bcrypt,则应使用它。
但是,假设您根本不能使用bcrypt或PHPASS。然后怎样呢?
尝试使用您的环境/应用程序/用户感知可以容忍的PHPASS实施PDKBF2。我建议的最低数量是2500发。另外,请确保使用maximum number of rounds(如果可用)以使操作难以重现。
未来实践
PHP 5.5引入了hash_hmac(),它消除了使用bcrypt的所有麻烦。尽管我们大多数人在最常见的环境(尤其是共享主机)中都坚持使用PHP 5.2和5.3,但@ircmaxell为即将推出的与PHP 5.3.7向下兼容的API构建了full password protection library。
密码学回顾与免责声明
实际破解散列密码所需的计算能力不存在。计算机“破解”密码的唯一方法是重新创建密码并模拟用于保护密码的哈希算法。哈希的速度与其被强行使用的能力成线性关系。更糟糕的是,大多数哈希算法可以很容易地并行化以更快地执行。这就是为什么像bcrypt和scrypt这样的昂贵方案如此重要的原因。
您可能无法预见所有威胁或攻击途径,因此必须尽最大努力来保护您的用户。如果您不这样做,那么您甚至可能会错过被攻击的事实,直到为时已晚...您才有责任。为了避免这种情况,首先要采取偏执的态度。 (内部)攻击您自己的软件,并尝试窃取用户凭据,或修改其他用户的帐户或访问其数据。如果您不测试系统的安全性,那么您就不能怪任何人。
最后:我不是密码学家。我所说的只是我的看法,但我碰巧认为这是基于良好的常识……以及大量的阅读资料。请记住,要尽可能地偏执,使事情难以侵入,然后,如果您仍然担心,请联系白帽黑客或密码学家,以了解他们对您的代码/系统的看法。
关于php - 保护PHP密码的哈希和盐值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54353342/
Internal Server Error: /admin/account/customuser/add/ Traceback (most recent call last): File "C:\
有问题!虽然我发现几乎相似的线程但没有帮助:( 我编写了一个 php 脚本来从我的 MySQL 数据库中获取注册用户的数量。该脚本在我的本地主机上运行良好;它使用给定的用户名、密码和主机名,分别是“r
我正在做一项基于密码的作业,我将 key 和消息放在单独的数组中。我想创建第三个数组,其中包含围绕消息大小的 key ,如下所示: message keykeyk 我已经在这个问题上苦苦挣扎了一段时间
我的几个客户要求我实现图形密码检查器,例如 关于如何实现这种 UI 有什么想法吗? 最佳答案 试着看看这个:https://code.google.com/p/android-lockpattern/
我正在使用 MAMP,每次登录 phpMyAdmin 时,都会收到以下错误/警告消息: the configuration file now needs a secret passphrase (bl
我正在尝试通过将 Visual Studio 2013 连接到我的测试机来调试 WDF 驱动程序。它创建一个名为 WDKRemoteUser 的用户,并在进行测试时尝试自动登录。有人知道这个用户的密码
使用具有指定用户名和密码的 SVN 提交。我希望服务器抛出错误;所以我可以告诉我的用户他/她的密码错误。 相反,在使用错误密码提交后: svn commit "test_file.txt" --use
我正在尝试实现 friend 推荐。 它从节点“你”开始。而且,我想找到节点“安娜”。 换句话说,这是我的两个或更多 friend 共同认识的人。上面的示例节点是 Anna。 如果您的帮助,我将不胜感
我都尝试过 wget --user=myuser --password=mypassword myfile 和 wget --ftp-user=myuser --ftp-password=mypass
我的一位用户提示说,每当他尝试使用默认管理界面(Django 的管理员)添加新用户(auth.User)时,新用户名和密码都会自动填充他自己的。 问题是他在登录时要求 Firefox 记住他的用户名/
我们正在开发一款应用(当然)用于应用购买 (IAP)。我已完成指南中的所有操作以启用 iap,并且一切正常,直到我想要购买为止。 部分代码: MainViewController.m -(vo
我试图创建两个可选匹配项的并集(如下所示),但我得到的不是并集,而是两者的交集。我应该如何更改此查询以获得所需的联合? optional match (a:PA)-[r2:network*2]-(b:
我想将Ansible用作另一个Python软件的一部分。在该软件中,我有一个包含其用户名/密码的主机列表。 有没有一种方法可以将SSH连接的用户/密码传递给Ansible ad-hoc命令或以加密方式
嗨,我在使用xampp的Apache Web服务器上收到错误500。直到我使用.htaccess,.htpasswd文件,错误才出现。我搜索了,但找不到语法错误。我只有1张图片和要保护的索引文件。以下
我一直使用它来编辑用户帐户信息: $this->validate($request, [ 'password' => 'min:6', 'password_confirmation'
我需要使用InstallUtil来安装C# Windows服务。我需要设置服务登录凭据(用户名和密码)。这一切都需要默默地完成。 有没有办法做这样的事情: installutil.exe myserv
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a software
如果我有一个随机的、16 个字符长的字母数字盐(不同大小写),它是为每个用户生成和存储的,我是否还需要一个站点范围的盐? 换句话说,这样好吗? sha1($user_salt . $password)
我正在开发一个空白程序,该程序将允许用户创建一个帐户,以便他们可以存储其余额和提款/存款。用户输入用户名和密码后,如何存储这些信息以便用户可以登录并查看其余额?我不一定要尝试使其非常安全,我只是希望能
我正在尝试寻找一种通用方法来搜索没有链接到另一个节点或节点集的节点或节点集。例如,我能够找到特定类型(例如 :Style)的所有节点,这些节点以某种方式连接到一组特定的节点(例如 :MetadataR
我是一名优秀的程序员,十分优秀!