将密码字段散列到数据库,在管理员中解散列?

时间:2016-10-28 作者:Alex Timmer

我正在使用高级自定义字段为我的登录创建某种个人数据库。ACF有一个密码字段类型,它工作得很好,但它将数据以纯文本形式存储到数据库中。所以我发现this topic 这使我们能够在将密码发送到数据库之前对其进行哈希运算:

function at_vault_encrypt( $value, $post_id, $field  )  
   {  
       $value = wp_hash_password( $value ); 
       return $value;  
   }  
 add_filter(\'acf/update_value/type=password\', \'at_vault_encrypt\', 10, 3);  
此函数使用wp_hash_password 并将其应用于ACF更新筛选器。我的问题的核心是:当获取的数据显示在后端时,我是否可以取消散列?

问题是,当我用密码保存一个项目并重新打开它时,它会显示哈希密码,而不是我输入的密码。如果我以后读不出密码,那么就不用再记下密码了。

所以我想我可能会“反散列”密码,但这似乎不是一个选项。也许这让WordPress走得太远了,这是不正确的,这只是一种额外的安全措施,不让字段以明文形式保存在数据库中。

(附:我不是来讨论数据安全的。我很清楚密码管理器和其他(可能更安全的)方法)。

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

根据定义,哈希是one-way ecnryption, 所以它是无法逆转的(也许一些超级黑客可以做到这一点,但这应该是非常困难或几乎不可能做到的)。这不是一个bug、问题或诸如此类的东西,而是每个站点的预期行为和工作方式。

许多人在多个服务中使用相同的密码,因此包括网站所有者在内的任何人都不应该知道用户的密码。想象一下该网站被黑客入侵,如果密码可以颠倒,黑客可以访问所有密码,而且可能不仅仅是你的网站。或者,站点所有者可以使用用户的密码访问其他站点中的用户帐户。

因此,如果您将密码散列为wp_hash_password(), 或者任何其他hashgin方法,而您无法对其进行解密,这与它的设计完全相同。

您可能对加密而不是哈希感兴趣,这种方法只有在应用于加密的规则已知的情况下才能反转,通常是通过使用密钥。您可以在PHP中执行此操作,例如mcrypt_encrypt()/mcrypt_decrypt(). 但对用户来说并不安全,因为网站所有者可以知道自己的密码;如果你需要保密但不需要完整性,请使用它。

或者你可能对编码感兴趣,但编码只是另一种人类可能无法直接阅读的格式的纯文本,只是因为它不习惯,不是因为它是安全的或以某种方式加密的,这就是为什么它可以通过转换回原始格式轻松解码(也就是说,你得到零安全性)。

PHP中一些现成的编码方法:

SO网友:Daniel

哈希并不意味着是可逆的。相反,您可以使用Base64之类的编码方案来存储信息:

// Encode
function at_vault_encode( $value, $post_id, $field  ) {  
  return base64_encode($value);
}  
add_filter(\'acf/update_value/type=password\', \'at_vault_encode\', 10, 3);

// Decode
function at_vault_decode( $value, $post_id, $field  ) {  
  return base64_decode($value);
}  
add_filter(\'acf/load_value/type=password\', \'at_vault_decode\', 10, 3);
然而,需要注意的是,这种存储密码的方式与存储纯文本字符串一样不安全。

相关推荐

是否有必要清理wp_set_password用户输入?

我正在尝试向WP注册表添加密码表单。请参见下面的代码。我想知道是否需要清理这个特定的用户输入?(如果是,怎么做?)如果我理解正确,WP为某些东西内置了净化功能,密码可能就是其中之一。对吗?WP会在将其添加到数据库之前自动对其进行清理吗?add_action( \'register_new_user\', \'registration_change_pass\', 10, 99 ); function registration_change_pass( $user_id ) { &