比较加密密码mysql / php

时间:2014-03-20 14:44:34

标签: php mysql encryption

数据库以下列方式加密密码:

encrypt('password', CONCAT('$', MD5(RAND()))));

我在PHP中选择了这个值,我想将它与用户输入进行比较。那么我将如何在PHP中重新创建?我没有得到的是,如果加密密码依赖于随机数,如何在php中生成相同的字符串并将其与原始字符串进行比较?

3 个答案:

答案 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);