我想在我的网站上进行安全的登录。 我决定在表单中使用3个输入。登录名和密码以登录到您的帐户,以及将在网站上显示的用户名。因此,如果有人可以访问该表,则他将需要强制使用登录名和密码。
我可以并且应该使用password_hash()
作为登录名还是应该使用普通的hash()
-ing吗?
答案 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;