问题描述

安装新鲜的 wordpress 时,应该做的一件事是更新 wp-config.php 中的盐。

该部分看起来像这样

define('AUTH_KEY',         'put your unique phrase here');
define('SECURE_AUTH_KEY',  'put your unique phrase here');
define('LOGGED_IN_KEY',    'put your unique phrase here');
define('NONCE_KEY',        'put your unique phrase here');
define('AUTH_SALT',        'put your unique phrase here');
define('SECURE_AUTH_SALT', 'put your unique phrase here');
define('LOGGED_IN_SALT',   'put your unique phrase here');
define('NONCE_SALT',       'put your unique phrase here');

如果客户端确实更改这些盐或者常量不存在,wordpress 将会将这些值保存在数据库内。

为了生成盐,它使用 wp_generate_password(64, true, true)这样做的代码可以在 1993 年的可插拔中找到。

现在的问题是:

  • wp_generate_password 与推荐的 https://api.wordpress.org/secret-key/1.1/salt/产生的盐一样安全

  • 通过在数据库中使用盐,这种方法可能会降低安全性。

  • 是否有任何安全隐患,无法设置值,并让它们随机生成数据库?

最佳解决方案

  1. Is wp_generate_password() as safe as the salts generated by the recommended https://api.wordpress.org/secret-key/1.1/salt/?

这些细节由于显而易见的原因无法回答,内部人员不知道。如果我们可以回答这个问题,那么将会知道允许逆向工程的细节。这可能导致安全性下降。请注意,有人仍然可以尝试为此 Url 设置一个请求数量,然后尝试逆向工程,以查看哪些气泡到表面。

  1. Is there any downgrade in security by having the salts in the database as this method falls back to that?

是。您不想将安全详细信息/身份验证凭据保存在其他人可以访问的任何地方。这包括:

  • 版本控制

  • 命令行历史

  • 数据库或文件备份

将您的身份验证凭据和相关数据 (例如”salt”) 保存在.env 文件 (参见 Dotenv package) 中,在您的部署服务秘密安全港中,在单独的配置文件 (例如 AWS 凭证文件) 中,因此仅在一个位置。

  1. Does it have any security implications to not set the values and let them be generated randomly on the fly to the db?

是。在 Cookie 中也使用了身份验证常数,您将无效用户登录会话,无效您的用户 Cookie 。这些是常数的原因:他们应该坚持不要更改每个请求。

编辑:正如 @gmazzap 指出的那样,我不是在说保存到数据库的值,而是关于 “生成的” 常量。如果将其保存到数据库中,请参阅有关安全性的第 2 点。

要进一步添加,请从 @Mark Kaplun 的 the link 中阅读并详细阅读 @gmazzap 答案 (并同时升级) 。

附加注意/提醒:始终向 API 服务器的检索数据添加一些自己的伪随机字符。永远不会将您的凭据或数据库放在手中。您不会相信人们往往会发送电子邮件,保存在 usb-sticks,他们的私人保管箱帐户或没有密码的笔记本电脑上的硬盘上

编辑:在 @stephenharris 在 [聊天] 中指出,有一个有趣的 blog post around that topic 比我们的答案更详细。

次佳解决方案

Is wp_generate_password() as safe as the salts generated by the recommended https://api.wordpress.org/secret-key/1.1/salt/

作为 @kaiser said,API 盐生成的内部细节是未知的,但是最重要的是,API 返回一个 64 个字符的字符串,其中每个字符是 wp_generate_password()使用的 92 个可能的字形之一。

请注意,如果服务器具有 PHP 7,则使用 PHP 7 CSPRNG 生成用于选择其中一个 92 个字形的随机整数,并且我怀疑该 API 将具有更强的功能。在较旧的 PHP 版本中,随机值由 mt_rand 提供。

考虑到这一点,考虑到密码的强度更多地依赖于加密算法,然后使用盐,我可以说,是的,wp_generate_password 非常可能与 API 产生的盐一样安全。

Is there any downgrade in security by having the salts in the database as this method falls back to that.

对于这一点,我同意 @kaiser 。

假设有人获取数据库转储副本,完成备份。在该数据库转储中,他们可以看到您的用户密码,但加密。

如果他们可以使用盐,那么他们更容易骇客你的网站。

此外,通过了解所使用的盐,用户 ID 和用户元 (存储会话令牌的位置),非常容易为任何用户重现非随机值,而无需知道”decrypted” 密码。

当然,如果恶意用户获取数据库的副本,您的安全性是非常危险的,但是通过在 db 中存储盐,您可以使恶意用户的生命更轻松。

Does it have any security implications to not set the values and let them be generated randomly on the fly to the db?

如果没有设置盐,它们仅在 WPA 第一次尝试访问它们时生成 wp_generate_password(),然后存储到数据库中,并在随后的请求中将它们从那里拉出。

如前所述,由 wp_generate_password()产生的盐本身并不糟糕,但是由于它们存储在 db 中,所以在先前所说的情况下,安全性的含义是:如果有人可以访问您的数据库副本,那么 db 副本含有盐。

然而,当 non-secure 值用于盐时,真正的安全隐患是。事实上,如果在配置中设置了弱值,WP 将不会产生任何值,但会使用该弱值。总之,如果选择在配置中没有盐和弱盐,前者肯定会更好。

请注意,在最近版本的 WP(不确定是哪个确切版本) 中,默认值'put your unique phrase here'被忽略,因此如果 wp-config.php 包含任何盐的值,WordPress 将忽略它,并使用 wp_generate_password()生成的值优于弱值,但比存储在配置中的强值更差 (因为在 db 中存储盐) 。即使使用相同的盐值多次使用盐,也可使用自动产生的值。

说明

  • 在更改之前,盐的更改将注销登录您的站点的任何用户,包括在您更改时未登录的用户,但在更改前登录时选择了”remember me” 选项。

  • 当使用”installer”(没有手动创建 wp-config.php) 安装 WordPress 时,会产生从 API 引出值的盐值。

第三种解决方案

  1. 这取决于机器上可以实现的随机性。我不会重新确定详细信息,但是如果您的机器的随机性不够好,那么 wordpress.org API 就是这样。

  2. 可能不会。如果有人有这样的访问您的数据库或代码,那么你是烤面包在任何情况下,得到盐是你面临的最不重要的问题。

  3. 这样做的原因是什么?从数据库中获取这 8 个值将使每个页面的服务速度稍微慢一点,而不会为您的安全性增加任何价值。

编辑:为什么随机性 (熵) 是重要的

首先,也许这个 https://security.stackexchange.com/questions/61676/why-do-wordpress-installations-retrieve-the-crypto-secrets-remotely-on-installat 会比我更好地解释它

问题是不应该猜到盐,因为它们是通过在大多数操作系统上的一些随机数发生器进行中继而产生的。但是并不是所有的随机生成器都是相等的,如果你的生成器不把它们作为输入的一些值,那么它会产生相同的数字序列,因此任何检查操作系统的行为的人都可以说出第一个将生成 1000 个数字,将其用作盐,并可以更容易地猜测您的密码。

这在共享主机环境中尤其成问题,其中所有站点使用相同的随机生成器,因此可以访问随机生成的数字的序列,并且基于 OS 的知识,并且其使用的随机算法可以猜测下一个和以前生成的数字。

旁注:这就是为什么智能手机和其他软件要求您在初始化设备/软件时进行一些随机输入的原因。该随机输入用作随机数生成的基础,并确保每个设备将生成不同的数字序列。

使用 wordpress.org 作为随机数字生成器的优点是,知道由它生成的数字是不可能的,因为您不知道使用哪种算法,如何初始化哪些算法,以及哪里按照你目前的顺序。

但是作为我所说的问题,转发外部服务也是一个安全问题。我发现这是边界偏执狂,因为这种攻击大道需要大多数攻击者缺乏 (在攻击 wordpress 网站的背景下) 的复杂性,我不会担心随机发生器的质量,但如果你这样做,你必须做的是自己生成盐,也许是使用一些与服务器无关的随机生成器软件,并更新配置文件。

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。