为简单的问题道歉,但我还在学习php / mysql
我尝试在注册时散列密码,但是一旦散列完成,用户就无法使用他们的密码登录。下面是我的变量的一小部分
$password = hash('sha512',$_POST['password']);
$confirmPassword = hash('sha512',$_POST['confirmPassword']);
- >因此,密码与确认密码匹配,然后使用Javascript和PHP对它们进行比较,如果匹配则将数据插入到数据库中。那么为什么它不允许用户登录?
目前在我的数据库中,我的密码列设置为CHAR(128),如果这有帮助吗?
答案 0 :(得分:1)
密码列的大小太小。请执行简单的操作:
echo sizeof(hash('sha512',$_POST['confirmPassword']));
并获得正确的数据库列大小。
答案 1 :(得分:1)
使用单个未加盐的SHA512以这种方式散列密码是不安全的。 PHP提供专用函数password_hash()和password_verify()来正确完成这项工作:
// Hash a new password for storing in the database.
// The function automatically generates a cryptographically safe salt.
$hashToStoreInDb = password_hash($_POST['password'], PASSWORD_DEFAULT);
// Check if the hash of the entered login password, matches the stored hash.
// The salt and the cost factor will be extracted from $existingHashFromDb.
$isPasswordCorrect = password_verify($_POST['password'], $existingHashFromDb);
要检查密码及其确认是否相同,您应该直接比较它们(明文),之前计算哈希值。
建议使用varchar(255)类型的数据库字段来存储此哈希,以备将来使用。