数据库以下列方式加密密码:
encrypt('password', CONCAT('$', MD5(RAND()))));我在PHP中选择这个值,我想将它与用户输入进行比较。那么,我如何在PHP中重新创建上面的内容呢?我不明白的是,如果加密密码依赖随机数,那么如何在php中生成相同的字符串并将其与原始字符串进行比较呢?
发布于 2014-03-20 15:04:22
MySql函数encrypt()似乎使用Unix crypt()函数。在这种情况下,您很可能会创建不安全的DES散列,而"salt“将作为结果哈希值的一部分存储。为了进行验证,您可以使用PHP函数,如下所示:
$isPasswordCorrect = crypt($password, $existingHashFromDb) === existingHashFromDb;请注意,以这种形式存储密码是非常不安全的,因为这种哈希算法对于散列密码来说太快了。相反,您应该使用类似于BCrypt的密钥派生函数,PHP具有自己的函数散列():
// 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);发布于 2014-03-20 14:49:08
最好的方法是在数据库站点上使用存储过程或函数,为用户/pass查询返回true/false。那样的话,你就只能在一个快乐中拥有一个功能了。
即使您不想创建其中之一,也不希望在db查询中使用相同的funcions,是由php生成的。
发布于 2014-03-20 14:50:25
您说得对,没有办法在php中重新创建密码,因为mysql函数中没有提供salt。我希望的是在mysql和php中提供相同的盐。确保将此值保存在安全的位置。
每个mysql加密文档:
使用Unix ()系统调用对str进行加密,并返回二进制字符串。salt参数必须是至少两个字符的字符串,否则结果将为NULL。如果不给出盐参数,则使用随机值。
注意最后一部分:如果没有给出salt参数,则使用一个随机值(您的情况)。
https://stackoverflow.com/questions/22536482
复制相似问题