我遇到以下代码的问题。它是从here中提取的,并在提交相应表单并通过验证时稍加修改以包括验证和触发。问题在于密码的散列。
散列密码与数据库中的密码不匹配,即使密码本身和salt相同也是如此。我已根据写入数据库的内容检查了$ hashed_password变量。他们完美匹配。在登录方面,盐匹配,但是当使用相同的密码时,盐之后的部分是不同的?结果如下所示:
$ 2A $ 05 $ Bj79bEbmWG9GeMbBAIXID.zMtNecb3B5qWkiGZrSccWcefQG7IXUy $ 2A $ 05 $ Bj79bEbmWG9GeMbBAIXID.6qNLDcZ21XAKoSOIriqTxlAUjjTygoy
您的用户名或密码存在问题。
除非我遗漏了一些明显的东西,否则我唯一能想到的是登录时使用的不同算法,但我不确定如何确认或更正。非常感谢任何帮助。
noConflict
答案 0 :(得分:2)
您可以免费使用相同功能,只需使用password_hash()功能即可。此函数将生成加密安全盐并使其成为哈希值的一部分,因此不需要单独的数据库字段。它还使用$2y
签名并为成本参数添加合理的默认值(5非常低)。
// Hash a new password for storing in the database.
// The function automatically generates a cryptographically safe salt.
$hashToStoreInDb = password_hash($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($password, $existingHashFromDb);
另请注意,您的代码不受SQL注入保护。尽快切换到准备好的语句,编写代码将比构建查询更容易,并且MYSQLI和PDO都支持它。这个answer可以给你一个开始。