Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
比较加密密码mysql/php_Php_Mysql_Encryption - Fatal编程技术网

比较加密密码mysql/php

比较加密密码mysql/php,php,mysql,encryption,Php,Mysql,Encryption,数据库按以下方式加密密码: encrypt('password', CONCAT('$', MD5(RAND())))); 我在PHP中选择这个值,我想将它与用户输入进行比较。那么我将如何用PHP重新创建上面的内容呢?我不明白的是,如果加密密码依赖于随机数,怎么可能在php中生成相同的字符串并将其与原始字符串进行比较?最好的方法是在数据库站点上使用存储过程或函数,该存储过程或函数将为用户/通过查询返回true/false。这样一来,一个褶裥中只有一个函数 即使您不想创建其中一个,也可以在php

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

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

我在PHP中选择这个值,我想将它与用户输入进行比较。那么我将如何用PHP重新创建上面的内容呢?我不明白的是,如果加密密码依赖于随机数,怎么可能在php中生成相同的字符串并将其与原始字符串进行比较?

最好的方法是在数据库站点上使用存储过程或函数,该存储过程或函数将为用户/通过查询返回true/false。这样一来,一个褶裥中只有一个函数


即使您不想创建其中一个,也可以在php生成的db查询中使用相同的函数。

您是对的,因为mysql函数中没有提供salt,所以无法在php中重新创建密码。 我的建议是在mysql和php中提供相同的salt。确保将此值保存在安全的地方

根据mysql加密文档:

使用Unix crypt系统调用加密str并返回二进制字符串。salt参数必须是至少包含两个字符的字符串,否则结果将为NULL。如果没有给出salt参数,则使用随机值


注意最后一部分:如果没有给出salt参数,则在您的情况下使用随机值。

MySql函数encrypt似乎使用Unix crypt函数。在这种情况下,您很可能创建不安全的DES哈希,salt将作为结果哈希值的一部分存储。为了进行验证,您可以使用如下PHP crypt函数:

$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);

你为什么要加密密码呢。你不能把它们散列出来吗?谁说这是个好主意?@Duncan这是邮件服务器数据库,我没有实现它。@MarkBaker用户可以很好地登录到IMAP。若并没有比较密码的机制,这不是不可能的吗?问题是邮件系统可以工作,ubuntu box、imap、pop3上都有pam身份验证,所有这些都可以使用crypt,重做整个系统会很痛苦。但我无法理解随机数是如何被使用的,用户仍然可以进入,你的解释对此有一些启示。@Slaven-你仍然有机会使用BCrypt。同一个crypt函数可以生成BCrypt散列,这取决于参数所使用的算法,您可以在我的。这两种散列类型都可以混合使用,因此如果您开始仅对新的散列使用BCrypt,那么您将是兼容的。但是,不能直接在SQL语句中进行验证。