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

Can i use PASSWORD_HASH for login names?

我想在我的网站上进行非常安全的登录。 我决定为我的表单使用 3 个输入。用于登录您的帐户的登录名和密码以及将显示在网站上的用户名。因此,如果有人可以访问 table,他将需要暴力破解登录名和密码。

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

您最有可能最终做的是拥有两个 table。

一个 table 将包含用户的数据,即唯一的用户 ID、用户名、姓名、电子邮件等。用户名,姓名,邮箱,都会被加密。

第二个 table 将是一个散列 table。这是您将用来验证用户的用户名和密码的 table。它应该具有唯一的用户 ID、用户名的散列值(无 IV),然后是您将使用 password_verify() 验证的密码。

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

检查用户名和密码后,您已确认您的用户具有适当的凭据,您将使用第一个 table 上的唯一用户 ID 进行第二次查询。当您查询 returns 数据时,它将是该用户的加密值,解密并准备好向用户显示用户信息。

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

我强烈建议使用 Libsodium Library 进行散列和加密。 (让本机 php 密码函数处理您所有的密码内容。)Libsodium 现在在最新的 PHP 版本上得到本机支持。

建议您的table和服务器的文件目录在两台物理上不同的机器上。这是因为您会将加密密钥存储在您的目录中,最好是在您的根目录下。如果您的服务器受到威胁,他们将无法直接访问您的 table,如果您的 table 受到威胁,他们将无法访问您的密钥。

希望这能让你朝着正确的方向前进。

已更新

这是一个简单的 encrypt/decrypt 例程,它将在没有 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;