使用比MD5更强大的保护来保护wp_USERS中的密码

时间:2017-01-17 作者:Hermants

我更喜欢为我的wp站点提供更好、更强的密码。在看了MD5 tube下面的内容并阅读了哈希插件之后,我找不到一个好的WP解决方案。

搜索hash plugins!

为什么不使用MD5 tube!

在phpmyadmin中,我只得到了MD5和SHA1,正如你在管道中看到的那样,它们很容易被破解。

但是,对于WP站点上的所有密码,什么才是真正好的保护呢?我找不到它。我是否必须向所有密码添加额外的代码字符串,如:@9I_^2u@wB72&_Äbõ. 我想这将使黑客变得非常困难。

2 个回复
最合适的回答,由SO网友:Rarst 整理而成

WP中的密码散列/检查系统是可插拔的,这本质上意味着它被设计为可以用自定义实现替换。由于依赖于默认值和兼容性,这通常无法完成。WP努力实现向后兼容性(例如最早的单个MD5实现)和可移植性(来自一个WP安装的哈希可以用于另一个WP安装)。

有现成的解决方案可以将哈希转换为更新、更安全的算法。目前主要考虑的是password_hash() 在PHP中,它被设计为经得起未来考验。使用的算法和SALT嵌入到生成的哈希中,所以您可以在将来继续使用更强大的算法,同时能够透明地验证旧的哈希。

来自快速搜索roots/wp-password-bcrypt 是此类实现之一。

SO网友:prosti

该解决方案称为盐渍,但不要将其与:https://api.wordpress.org/secret-key/1.1/salt/ 这在WordPress中还有另一个目的,就像我一样。

---------------------------------------------------
text       | newpass
---------------------------------------------------
md5        | e6053eb8d35e02ae40beeeacef203c1a
---------------------------------------------------
salted md5 | $P$BECVJLnxOXJ3ywcDz0FY0bgUcDFP02/
---------------------------------------------------
你的猜测是对的,如果密码以md5的形式保存在数据库中,那么破解它可能很容易。

但是,WordPress会在数据库中保存加密的md5密码。

此函数

File: wp-includes/class-phpass.php
225:    function HashPassword($password)
226:    {
227:        if ( strlen( $password ) > 4096 ) {
228:            return \'*\';
229:        }
230: 
231:        $random = \'\';
232: 
233:        if (CRYPT_BLOWFISH == 1 && !$this->portable_hashes) {
234:            $random = $this->get_random_bytes(16);
235:            $hash =
236:                crypt($password, $this->gensalt_blowfish($random));
237:            if (strlen($hash) == 60)
238:                return $hash;
239:        }
240: 
241:        if (CRYPT_EXT_DES == 1 && !$this->portable_hashes) {
242:            if (strlen($random) < 3)
243:                $random = $this->get_random_bytes(3);
244:            $hash =
245:                crypt($password, $this->gensalt_extended($random));
246:            if (strlen($hash) == 20)
247:                return $hash;
248:        }
249: 
250:        if (strlen($random) < 6)
251:            $random = $this->get_random_bytes(6);
252:        $hash =
253:            $this->crypt_private($password,
254:            $this->gensalt_private($random));
255:        if (strlen($hash) == 34)
256:            return $hash;
257: 
258:        # Returning \'*\' on error is safe here, but would _not_ be safe
259:        # in a crypt(3)-like function used _both_ for generating new
260:        # hashes and for validating passwords against existing hashes.
261:        return \'*\';
262:    }
里面有不同的腌制功能。

如果您使用wp-cli 要多次生成密码,您会注意到每次尝试都会生成不同的密码:

wp user update 1 --user_pass=newpass
这样,如果有人得到你的数据库,它就猜不到你的密码。

在向后兼容性方面有一些优势,您可以在数据库中设置md5非盐密码,这将起作用。然而,WordPress应该很聪明,在第一次尝试登录时就添加该密码。

在以前的一些WordPress版本中,我可以确认我可以将WordPress密码设置为纯文本,并且在下一次尝试登录时,密码将被加密。这已经不可能了。

您也可以查看wp_generate_passwordwp_hash_password 了解更多详细信息。

相关推荐

Password Protected Page Title

我目前正在使用Sage 8.5.1主题,并且有一些受密码保护的页面。客户希望删除“受保护”一词,但不希望删除标题。我使用了此代码段add_filter( \'protected_title_format\', \'remove_protected_text\' ); function remove_protected_text() { return __(\'%s\'); } 但它也删除了标题。我看过了,似乎到处都在使用基本相同的代码片段。我在根语篇上提出了这个问