该解决方案称为盐渍,但不要将其与: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_password 和wp_hash_password 了解更多详细信息。