我正在使用 PHP。我想要一个安全快速的密码加密系统。将密码散列一百万次可能更安全,但也更慢。如何在速度和安全之间取得良好的平衡?我想知道 php 中最好的加密方法以及如何应用它。
4 回答
我建议使用新的PHP 5.5 密码 API。它提供了一种安全的密码散列方法,同时速度足够快。
如果您没有可用的 PHP 5.5,则有一个适用于 PHP 5.3.7+的 polyfill:https ://github.com/ircmaxell/password_compat
使用PHPass,它是一个优秀的哈希框架,非常易于使用!
使用 SHA512 http://php.net/manual/en/function.hash.php。SHA512 未破解。我建议使用盐:在散列之前附加到密码的一些随机字符串。如果攻击者获得对包含密码和盐的数据库的访问权限,这可以防止预先计算的彩虹表,但不能防止字典攻击。SHA512(password + salt) --> hash 将hash和salt存储在数据库中检查密码时,检索用户对应的salt,将其与密码连接,对其进行散列并与存储的散列进行比较。在此处阅读:暴力破解加盐 SHA-512 哈希需要多长时间?(提供盐)
回想一下您的问题,尤其是您的陈述“将密码散列一百万次可能更安全,但也更慢。如何在速度和安全性之间取得良好的平衡”。事实上,重复散列将保护您免受字典攻击,因为计算字典中的所有散列的计算成本非常高。我在这里没有教你任何东西。从我给你的第一个链接来看,计算一个 SHA512 哈希大约需要 46 毫秒,这比较长。当您处于军备竞赛环境中时,我可以想到以下可能会影响您的决定的因素: - 增加计算能力(更多 CPU 内核和 GPU 计算) - 随着时间的推移改进算法 - 攻击者可用的金额 -如果被破解,离开您的网站的价值(如果低,这不值得付出努力)反对 - 您可以使用的 CPU 能力 根据经验,我会尽可能多地进行哈希处理,以免影响我的网站性能。考虑到每秒的登录次数,您可以粗略地计算出在不影响站点性能的情况下您可以负担的 CPU 功率量。
最后一条评论:假设黑客已经可以访问包含用户名和散列密码的表,那么您可能会更担心他们可以在您的网站上做的所有坏事。
你不是在寻找加密 - 你在寻找散列。
我建议 openwalls phpass http://www.openwall.com/phpass/
如果您使用的是 PHP5.5,他们有一个密码 API http://uk3.php.net/password
了解更多信息。
MD5(无盐)已经使用了一段时间,周围有大量的查找列表,结合现代硬件每秒获得 700K + 密码,“反转”密码根本不需要很长时间。
加盐更安全,但仍然可以快速破解