问题说明了这一切,密码是应该使用双向加密存储还是仅存储1种方式?
答案 0 :(得分:9)
密码应该通过盐渍哈希存储。加密意味着您基本上希望/能够解密它。单向散列是最好的,那么您可以简单地将现有散列与用户用于登录的散列或任何任务进行比较。
点是......单向哈希。
编辑:根据史蒂文斯的评论。以下RFC 2898涵盖了一些关键的散列技术。它也是一个很好的阅读。
答案 1 :(得分:3)
单向散列是一种方法。如果有人可以解密我的密码,如果他以某种方式访问存储的数据库,我会很高兴。如果可以解密密码,这是一个真正的安全问题。
只需保存散列密码,然后将散列输入与数据库中的散列进行比较。这是迄今为止最常见且最省力的基本身份验证方法。
答案 2 :(得分:2)
应尽可能使用单向加密(或盐渍哈希函数)存储它们。
可能不的情况是您的应用程序需要使用密码登录仅支持纯文本身份验证的外部系统(例如数据库)的情况。在这种情况下,您需要能够解密密码才能登录。
但是,如果您正在讨论如何存储用户用来访问您的应用程序的密码,那么单向加密/散列肯定是这样做的。
答案 3 :(得分:1)
答案 4 :(得分:0)
无论如何 - 重要的是解密密钥安全且独立于数据 - 这意味着非对称加密在计算上非常昂贵 - 并且与散列+安全重置机制相比通常没有明显的好处。
答案 5 :(得分:0)
哈希是一个随机字符串,加密模糊了一个可能会被解密的字符串。
但是,使用散列,也可能产生碰撞。这取决于您的需求。如果您认为需要重新获取原始字符串,请加密密码。如果只是用户的密码,那么哈希吧。如果他们忘记了当前密码,您可以轻松地为他们生成新密码。
答案 6 :(得分:0)
现在,如果您存储的某些数据是通过可能被拦截的网络传输的,那么您将使用加密/解密
如果您在用户密码庄园中谈论凭证,那么Hashing就是您的选择。
尊重是当你说加密时你立即拥有可检索的一面 Decryption ,使用哈希你不需要检索已编译文本的值,只是用另一个哈希来检查它
您可以将两者结合在一起,以便在网络上传输数据,但它们仍然保持不变,只需互相使用即可相互验证。
如何在PHP中进行散列的示例如下:
哈希
define('LOCAL_USER_SALT',£F$%^GH*&^%HG&*^%F&*(K(*');
然后这个哈希应该永远不会改变,这就是静态哈希并且会用来夸大哈希密码,让我告诉你
class User
{
//..
function AddUserToDatabase($username,$password,$meta = array())
{
//Create a db salt
$salt = md5(uniqid() . microtime() . $username . microtime(true));
//Now we create a hashed version of the
$password = md5($password . $salt . LOCAL_USER_SALT);
//Then you would insert the $salt and $hash to the DB
}
//..
}
阅读评论后,您可以这样检查:
class User
{
//..
public function CheckCredentials($username,$pass)
{
//Get results from DB where $username is set in the column
//lets say $db_row is the data from the sql query
$check = md5($password . $db_row['salt'] . LOCAL_USER_SALT);
if($password == $check)
{
//The user exists.
}
}
//..
}
所以这称为1路哈希,没有必要为您的用户凭据提供可逆算法。