我可以使用PASSWORD_HASH作为登录名吗?

时间:2018-07-09 02:24:22

标签: php string-hashing

我想在我的网站上进行安全的登录。 我决定在表单中使用3个输入。登录名和密码以登录到您的帐户,以及将在网站上显示的用户名。因此,如果有人可以访问该表,则他将需要强制使用登录名和密码。

我可以并且应该使用password_hash()作为登录名还是应该使用普通的hash() -ing吗?

1 个答案:

答案 0 :(得分:1)

您最终可能要做的就是拥有两个表。

一个表将包含用户的数据,即唯一的用户ID,用户名,名称,电子邮件等。用户名,名称,电子邮件都将被加密。

第二个表将是一个哈希表。这是用于验证用户名和密码的表。它应该具有唯一的用户ID,用户名的哈希值(无IV),然后是您将使用password_verify()进行验证的密码。

当您的用户登录时,他们将提供其用户名和密码。用户名将通过没有IV的相同过程进行哈希处理,以使哈希值始终等于存储在该用户名的哈希表中的哈希值。这将允许您查询适当的记录以检查密码。使用password_verify()功能检查密码。

签出用户名和密码后,您已经确认用户具有适当的凭据,您将使用第一张表上的唯一用户ID进行第二次查询。当查询返回数据时,它将是该用户的加密值,解密后,您就可以向用户显示用户的信息了。

如果我可以访问您的表,我将永远不会看到您的用户信息。我将能够看到唯一的用户ID,并看到ID与两个表中的ID都匹配,但是可以说所有值都是经过哈希处理或加密的。

我强烈建议您使用Libsodium Library进行哈希和加密。 (让本机php密码功能处理您所有的密码问题。)现在,最新的PHP版本本机支持Libsodium。

建议您的表和服务器的文件目录位于两台物理不同的计算机上。这是因为您将把加密密钥存储在目录中,最好是在根目录下。如果您的服务器受到威胁,则它们将无法直接访问您的表;如果您的表受到了破坏,则它们将无法访问您的键。

希望这能使您朝正确的方向前进。

已更新

这是一个简单的加密/解密例程,无需使用IV即可加密用户名。这意味着只要密钥保持不变,它将每次将相同的纯文本加密为相同的密文。这样,您就可以针对数据库中的相同密文查询密文。

define("MYKEY_", base64_decode('LoPCPKd8iDxHvb8mATzhhg=='));

function encryptName($plainText) {

  return base64_encode(openssl_encrypt($plainText, 'AES-128-CBC', MYKEY_, OPENSSL_RAW_DATA, NULL));

}

function decryptName($cipherText) {

  return openssl_decrypt(base64_decode($cipherText), 'AES-128-CBC', MYKEY_, OPENSSL_RAW_DATA, NULL);

}


$text = 'myUserName';

$cipherText = encryptName($text);
echo $cipherText . '<br>';

$plainText = decryptName($cipherText);
echo $plainText;