Php 我可以使用密码\u散列作为登录名吗?

Php 我可以使用密码\u散列作为登录名吗?,php,string-hashing,Php,String Hashing,我想在我的网站上有一个相当安全的登录。 我决定在表格中使用3个输入。登录帐户的登录名和密码以及将在网站上显示的用户名。因此,如果有人访问该表,他将需要强制登录和密码 我可以也应该使用password\u hash()作为登录名,还是应该使用普通的hash()-ing?您最有可能最终使用的是两个表 一个表将包含用户的数据,即唯一的用户id、用户名、名称、电子邮件等。用户名、姓名、电子邮件都将被加密 第二个表将是一个哈希表。这是用于验证用户用户名和密码的表。它应该有唯一的用户id、用户名的散列(no

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


我可以也应该使用
password\u hash()
作为登录名,还是应该使用普通的
hash()
-ing?

您最有可能最终使用的是两个表

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

第二个表将是一个哈希表。这是用于验证用户用户名和密码的表。它应该有唯一的用户id、用户名的散列(no IV)值,然后是您的密码,您将使用
password\u verify()
进行验证

当用户登录时,他们将提供用户名和密码。用户名将通过相同的过程进行散列,没有IV,以允许散列始终等于该用户用户名的散列表中存储的散列。这将允许您查询相应的记录以检查密码。使用
password\u verify()
功能检查密码

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

如果我能够访问您的表,我将永远看不到您用户的任何信息。我将能够看到唯一的用户id,并看到id与两个表上的id匹配,但也就是说,所有的值都是散列的或加密的

我强烈建议使用来进行哈希和加密。(让本机php密码函数处理所有密码内容。)现在最新的php版本本机支持libnaid

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

希望这能让你走上正确的方向

已更新

下面是一个简单的加密/解密例程,它将在不使用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;
define(“MYKEY”,base64解码(“lopcpkd8idxhvb8matzhhhg=”);
函数encryptName($plainText){
返回base64_编码(openssl_加密($plainText,'AES-128-CBC',MYKEY_,openssl_原始数据,NULL));
}
函数名($cipherText){
返回openssl_decrypt(base64_decode($cipherText),'AES-128-CBC',MYKEY_,openssl_原始数据,NULL);
}
$text='myUserName';
$cipherText=加密名称($text);
回显$cipherText。”
'; $plainText=解密名称($cipherText); echo$纯文本;
这听起来像是在不增加安全性的情况下让事情变得复杂
password\u hash()
用于验证pw,当您可以使用已知的未删除值(如裸用户名)检索哈希时。从数据库中获取哈希值,然后尝试使用
password\u verify()
检查它是否正确。因此,您必须已经有权访问已知值才能查找它进行比较。可能只需加密用户名。如果您有单独的哈希登录名,则必须通过某种外键以某种方式将该值与可见用户名关联,所以我看不到通过模糊它会得到什么,但为什么它总是给我一个不同的散列呢?当我使用相同的登录名创建帐户时,它会显示不同的哈希。。。因此,即使我对登录名进行散列,然后创建一个SQL调用,我也找不到它,因为同一个登录名有不同的散列:/所以最好对用户名进行散列,而不是对登录名进行散列,对吗?因此,黑客在不知道某个特定用户的姓名的情况下,无法将其作为攻击目标。但是我如何“取消”名称,然后将其显示在我的页面上?请发布到目前为止的代码。因此我需要两个表,一个表包含所有数据、名称、电子邮件、用户名等,另一个表仅包含哈希密码?你所说的用户ID是什么意思?您是指用户名还是主要行索引(id)?什么是“散列(无IV)值”?是的,唯一id将是用户唯一的id,也可以视为行id。散列表将具有唯一id、散列用户名和普通密码。主表将包含除唯一id之外的所有加密用户数据,该id将在两个表之间共享。可以将IV或初始化向量视为散列上的盐。如果IV更改,则散列将更改。所以用户名需要一直用同一个IV进行散列。我在youtube上搜索如何加密和解密字符串,这样我就可以反转它。我想在登录成功时解密用户名。我找不到任何东西,当我发现某些东西过时或我不理解时。请确保您可以使用libnaudio库。如果您没有当前版本的PHP,则必须在您的计算机上安装libnaid。一旦安装并运行,请学习此示例。如果你不能解决这个问题,用你尝试过的代码在stackoverflow上发布另一个问题。我想我会这样做的。我将使用
password\u hash()
对密码进行散列,并对登录名进行单向加密,因此需要有人键入exa