数据库以下列方式加密密码:
encrypt('password', CONCAT('$', MD5(RAND()))));
我在PHP中选择了这个值,我想将它与用户输入进行比较。那么我将如何在PHP中重新创建?我没有得到的是,如果加密密码依赖于随机数,如何在php中生成相同的字符串并将其与原始字符串进行比较?
答案 0 :(得分:0)
最好的方法是在数据库站点上使用存储过程或函数,它将为用户/传递查询返回true / false。这样你就可以只有一个功能。
即使您不想创建其中一个而不是使用php生成的相同功能内部数据库查询。
答案 1 :(得分:0)
你是对的,因为没有在mysql函数中提供salt,所以无法在php中重新创建密码。 我所提到的是在mysql和php中提供相同的salt。确保将此值保存在安全的地方。
每个mysql加密文档:
使用Unix crypt()系统调用加密str并返回二进制字符串。 salt参数必须是至少包含两个字符的字符串,否则结果将为NULL。如果没有给出salt参数,则使用随机值。
注意最后一部分:如果没有给出salt参数,则使用随机值(您的情况)。
答案 2 :(得分:0)
似乎MySql函数encrypt()
使用Unix crypt()
函数。在这种情况下,您很可能会创建不安全的DES哈希值,并且“salt”将作为生成的哈希值的一部分进行存储。要进行验证,您可以使用PHP crypt()
函数,如下所示:
$isPasswordCorrect = crypt($password, $existingHashFromDb) === existingHashFromDb;
请注意,以这种形式存储密码是非常不安全,因为这种散列算法对于散列密码来说太快了。相反,你应该使用像BCrypt这样的密钥派生函数,PHP拥有它自己的函数password_hash():
// Hash a new password for storing in the database.
// The function automatically generates a cryptographically safe salt.
$hashToStoreInDb = password_hash($password, PASSWORD_BCRYPT);
// 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);