Php 我可以从数据库中获取我的salt,然后在同一查询中检查密码吗?
我最近添加了一个类,该类使用存储在members表中的唯一盐类。这是我使用salts之前的登录脚本:Php 我可以从数据库中获取我的salt,然后在同一查询中检查密码吗?,php,mysql,hash,login,passwords,Php,Mysql,Hash,Login,Passwords,我最近添加了一个类,该类使用存储在members表中的唯一盐类。这是我使用salts之前的登录脚本: $sql = 'SELECT id, username FROM member WHERE username = ? AND pass = ?'; $result = $this->DB->query($sql, array($username, $pass)); foreach($result as $record) { $user = [
$sql = 'SELECT id, username FROM member WHERE username = ? AND pass = ?';
$result = $this->DB->query($sql, array($username, $pass));
foreach($result as $record) {
$user = [
"id" => $record['id'],
"username" => $record['name']];
}
if (empty($user)) {
// Display errors
} else {
// Login by sending the array of data to login function
self::login($user);
}
现在,我也想去拿盐。是否有任何方法可以在不使用多个查询的情况下执行此操作?我可以通过一个查询来获得用户通行证和salt,但有更好的方法吗。这感觉有点像黑客攻击,还是不可避免?您可以这样做(假设通行证创建为MD5($salt.$password)
,并且您的成员表中有一个名为salt
的列):
通过这种方式,MySQL直接检查插入密码和salt后创建的存储哈希。您可以这样做(假设pass
被创建为MD5($salt.$password)
,并且在成员表中有名为salt
的列):
通过这种方式,MySQL直接检查插入密码和salt后创建的存储哈希。您的数据库不提供密码的安全哈希函数,MD5
和任何其他快速哈希函数都不应用于密码哈希
这就是为什么不能用一个查询检查密码散列。相反,您可以对数据库进行单个查询,获取密码哈希:
SELECT username, pass FROM member WHERE username = ?
现在,您可以使用php检查pass
,而不是使用SQL。这样,您也只需要1个查询,但可以使用安全的哈希算法。盐可以与哈希值一起存储在相同的pass
字段中
建议使用BCrypt。PHP5.5将拥有自己的函数password\u hash()
和password\u verify()
以简化此任务。PHP5.3/5.4有一个可用的,可在下载。您的数据库不提供密码的安全哈希函数,MD5
和任何其他快速哈希函数都不应用于密码哈希
这就是为什么不能用一个查询检查密码散列。相反,您可以对数据库进行单个查询,获取密码哈希:
SELECT username, pass FROM member WHERE username = ?
现在,您可以使用php检查pass
,而不是使用SQL。这样,您也只需要1个查询,但可以使用安全的哈希算法。盐可以与哈希值一起存储在相同的pass
字段中
建议使用BCrypt。PHP5.5将拥有自己的函数password\u hash()
和password\u verify()
以简化此任务。PHP 5.3/5.4有一个可用的,可在下载。因此,您正在通过网络发送未更改的密码,做得很好。@Santhos大多数PHP+mysql托管我都在同一个网络上或在同一个网络内遇到过主机web托管和数据库。。。如果您不能信任该环境,那么首先不要将您的应用程序托管在该环境中。如果你需要使用“外部”数据库,你总是可以使用它,这样你就可以通过网络发送未加密的密码,做得好。@Santhos大多数php+mysql托管我都遇到过在同一个网络上或在同一个网络内同时托管web托管和数据库的情况。。。如果您不能信任该环境,那么首先不要将您的应用程序托管在该环境中。如果您需要使用“外部”数据库,则始终可以使用