网站所有者喜欢 WordPress。以至于大约 40%的人选择它作为他们在线项目的基础。然而,您可能会惊讶地发现,有些人不太了解世界上最流行的内容管理系统(CMS) 的工作原理。也许更令人担忧的是,他们担心 WP 安全性的某些方面,更具体地说,是散列用户密码的机制。让我们更详细地探索该领域,看看批评是否成立。
什么是哈希?
作为网站所有者,您有责任保护用户数据免受黑客攻击。存储他们的密码是其中的一个重要部分。想象一下,黑客设法突破了您的防御并窃取了您网站的数据库。这已经是一场噩梦,因为根据您提供的服务类型,您的数据库可能充满了敏感信息。
但是,情况可能会变得更糟。如果您以纯文本形式存储用户密码,那么绝对没有什么可以阻止黑客利用它们。我们都知道人们在多个不同的帐户上重复使用相同的密码。如果犯罪分子决定针对其他在线服务尝试窃取的凭据,他们很有可能成功侵入。一次泄露可能导致大量数据泄露。
散列的目的是包含所有这些。散列是一种加密函数,可将文本转换为由字母和数字组成的乱码,称为散列。当用户选择密码时,Web 应用程序将其通过散列函数传递,然后将生成的散列存储到数据库中。
下次用户尝试登录时,他们输入的密码会通过相同的机制,并将哈希值与存储在数据库中的内容进行比较。如果匹配,则系统允许用户进入。如果不匹配,则网站返回错误。
有一些在线生成器可以说明 WordPress 密码哈希的样子。下面你可以根据Code Beautify 的生成器看到“Password123!#”的哈希值。散列的关键在于它是一种单向函数。理论上,应该不可能逆转该过程并从哈希中导出纯文本密码。
然而,通常情况下,理论和现实并不匹配。有许多不同的散列算法,其中一些提供比其他更好的安全性。随着硬件的发展,黑客的蛮力攻击变得越来越强大,我们已经到了只有少数算法被认为足以正确保护用户密码的地步。
您可能需要一些帮助才能了解某些散列机制比其他机制强多少。为了说明差异,像Jeremi Gosney这样的专家经常模拟针对流行散列算法的各种攻击,并在专门用于密码安全的活动中分享结果。
2012年,Gosney 使用一组 GPU 对几种哈希算法的简单实现发起暴力攻击。我们现在将总结三种最流行的机制的结果。在对MD5 算法的攻击中,Gosney每秒进行了 1800 亿次猜测。有了这个,他将在九个多小时内成功猜出所有可能的 8 个字符的密码。
在攻击SHA1时,Gosney每秒进行大约 610 亿次猜测,这将使他能够在大约 27 小时内成功猜出所有 8 个字符的密码。
在攻击bcrypt时,他每秒只能进行71000 次猜测,这意味着他需要2700 年才能成功猜出所有可能的 8 个字符的密码。
上面的数字是用现在大约十年前的 GPU 记录的。现代硬件功能更强大,可以实现更快的蛮力攻击。然而,Gosney 的结果在说明MD5 和 bcrypt 等算法之间的差异方面一如既往地出色。你会认为世界上最受欢迎的 CMS WordPress 会使用一种更难破解的算法。你可能会大吃一惊。
WordPress 使用什么类型的散列?
WordPress 最初有一个简单的 MD5 散列算法实现。与许多竞争对手相比,MD5 有一个明显的优势——速度非常快。然而,即使早在 2007 年,针对 MD5 哈希的碰撞攻击在普通 PC 上花费的时间也不超过几秒钟。不用说,当时 WP 的开发团队因使用该算法而获得了很多支持。
WordPress 2.5 于 2008 年发布,附带PHPass(发音为 PH-Pass)。PHPass 是一个散列框架,支持多种散列算法,包括 MD5 和bcrypt。正如我们在上一节中建立的,bcrypt 比 MD5 强大得多,并且被广泛认为是 PHP 应用程序的最佳哈希算法。
然而,WP 的 PHPass 实现至今仍在使用 MD5。在这一点上,我们需要强调一个事实,尽管 WordPress 的散列机制是基于 MD5 的,但它提供了足够的安全性。
PHPass在散列之前为每个密码添加加密盐。盐是在使用散列机制之前附加到纯文本密码的唯一数据。多亏了它,相同的密码不会产生相同的哈希值,并且黑客很难猜测用户选择的密码是什么。此外,PHPass 进行了八次基于 MD5 的散列,并采用密钥和密码拉伸技术进一步保护凭据。由于这一切,对 WordPress 散列机制的暴力攻击是不切实际的。目前,就是这样。
为什么 WordPress 继续使用 MD5?
稍微倒带一下,您会发现在 PHP 项目中实现一个强大的散列算法并不完全是在公园里散步。然而,PHP 5.5 引入了对 bcrypt 的官方支持,具有用于哈希密码和在登录尝试期间验证它们的本机函数。WordPress 的散列机制目前确实提供了足够的安全性。尽管如此,许多人仍然认为,鉴于可以在没有太多麻烦的情况下实施的更强大的算法的可用性,保持原样是没有意义的。
然而,WordPress 的开发团队似乎奇怪地不愿意对核心的这个特定部分进行任何更改。这样做的原因是向后兼容。WordPress 保持其受欢迎程度并继续扩大其市场份额,不仅因为它的用途广泛且易于使用,而且因为它几乎可以在任何托管平台上运行。太多的人使用遗留系统来构建新项目,并且许多现有的网站在非常过时的托管环境中运行。
旧软件使这些项目成为黑客的避风港,因此 WP 的散列机制可能是他们最不担心的问题,特别是考虑到它提供的良好安全性。CMS 的开发人员知道更改散列机制可能会影响很多项目,他们不愿意这样做。
这是“如果它没有损坏,就不要修复它”策略的例证,您必须同意,特别是考虑到可能受到影响的人数众多,其背后有一些逻辑。但是,许多网站所有者认为安全是组织项目各个方面的最高优先级。对他们来说,使用基于像 MD5 这样弱的算法的散列机制还不够好。对他们来说幸运的是,还有其他选择。
使用插件更改 WordPress 网站的哈希算法
得益于WP 的模块化架构,您可以轻松更改网站的密码存储系统。在 WP 的官方插件目录中搜索“bcrypt”,你会发现相当多的匹配项。安装它们是一个标准的、两次点击的工作,而且几乎所有人都承诺从 MD5 切换到 bcrypt 而不告诉所有用户重置他们的密码。Roots.io是一家创建各种WordPress 开发工具的公司,也有一个插件可以让您使用 bcrypt。但是官方目录上没有,所以安装过程不一样。让我们按照步骤操作。
1. 从 GitHub 下载插件。
Roots 的插件可在此处获得。要下载它,请单击代码,然后选择下载 ZIP。在您的计算机上保存文件后,您需要解压缩存档。
2. 在 wp-content 文件夹中创建一个新目录。
Roots 创建的插件需要在“wp-content”目录下创建一个名为“mu-plugins”的文件夹。您可以通过 SSH、网络托管控制面板中的文件管理器或您最喜欢的 FTP 客户端来完成。
3. 上传 wp-password-bcrypt.php 文件。
要安装和激活插件,请将“wp-password-bcrypt.php”文件上传到“mu-plugins”文件夹。
注意:您不需要上传存档的全部内容。只需要 PHP 文件。
该插件将出现在必须使用选项卡下的插件>已安装插件菜单中。因为 Roots.io 的插件是所谓的必备插件之一,它会在安装时自动激活,用户无法从 WordPress 仪表板停用它。摆脱它的唯一方法是将它从 mu-plugins 目录中删除,因此如果多个人可以访问WP 仪表板并且您想确保他们不会干预网站的内容,那么使用它是一个好主意密码哈希机制。
所有 bcrypt WP 插件都在后台运行,你不能期待任何不同的特性或功能。但是,插件解决问题的方式有所不同。一些使用原生 PHP 函数来散列和验证密码,而另一些则重新配置 PHPass 框架以使用 bcrypt 而不是 MD5。在所有情况下,您都需要PHP 5.5 或更新版本,无论如何您都应该使用它。插件的选择取决于个人喜好。如果它们在您看来都一样,请务必阅读评论并了解使用它们的人的想法。
结论
尽管 WP 的密码存储系统不是基于当前可用的最安全的哈希算法,但不会对您的网站及其访问者的安全造成直接威胁。然而,WP 的模块化架构和使项目保持活力的全球社区意味着您只需单击几下鼠标就可以使用更复杂的密码哈希算法。说相同的架构和社区使 WordPress 成为世界上最流行的网站建设应用程序,你不会错。