Php 我可以从数据库中获取我的salt,然后在同一查询中检查密码吗?

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 = [

我最近添加了一个类,该类使用存储在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 = [
    "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托管和数据库的情况。。。如果您不能信任该环境,那么首先不要将您的应用程序托管在该环境中。如果您需要使用“外部”数据库,则始终可以使用