【问题标题】:Is session ID hashing more secure than plain storage?会话 ID 散列是否比普通存储更安全?
【发布时间】:2014-04-03 18:51:04
【问题描述】:

我有一个 PHP/MySQL 应用程序,我将会话数据存储在我的数据库中。以下是相关处理程序的一些伪代码:

function session_read($sessionId) {
    $result = query('select session_data from sessions where id = ?', $sessionId);
    if(!$result) $result = array('session_data' => '');
    return $result['session_data'];
}

function session_write($sessionId, $data) {
    query('replace into session_data set data = ? where id = ?', $data, $sessionId);
    return true;
}

在我看来,在会话期间,会话 ID 可能与用户密码一样敏感。我想知道在评估之前对会话 ID 进行散列是否会提供额外的安全性?

function session_read($sessionId) {
    $sessionId = hash('sha512', $sessionId);
    $result = query('select session_data from sessions where id = ?', $sessionId);
    if(!$result) $result = array('session_data' => '');
    return $result['session_data'];
}

function session_write($sessionId, $data) {
    $sessionId = hash('sha512', $sessionId);
    query('replace into session_data set data = ? where id = ?', $data, $sessionId);
    return true;
}

通过这种方式,即使攻击者设法检索到会话表的转储,他们也无法轻易制作 cookie 来劫持任何用户会话。

这是一种有用的做法吗?

编辑:该站点通过 HTTPS 提供,并且 cookie 是 HTTPONLY。

【问题讨论】:

  • 重点是什么?无论如何,会话 ID 在 http 标头中作为 cookie 以明文形式传输。如果你不希望 cookie 被盗,那就改用 https。
  • 如果你是理智的,并不总是“清楚”
  • "会话 ID 可以像用户密码一样敏感" => 不一定。如果安全是一个问题,您可以(并且许多人确实)要求用户在执行真正敏感的操作之前重新进行身份验证。

标签: php mysql security session hash


【解决方案1】:

如果数据库遭到入侵,并且您总是在将用户的会话 ID 值用于数据库之前对其进行哈希处理,那么是的,这确实使它更安全。这假设数据库泄漏的程度只是对会话表的视图访问。如果他们有写权限,或者有权限操作 PHP 源代码,那么所有的赌注都没有了。

需要担心的更重要的事情是确保会话 ID 是随机生成的,这样他们就不能只是暴力破解或以其他方式猜测有效的会话 ID 是什么。因此,没有顺序会话 ID,也没有从弱 PRNG(早期版本的 PHP 受此影响)或其他容易确定的值(例如时间)生成的 ID。

根据您的设置,您可能希望将会话 ID 限制为会话开始时用户的 IP 地址。这有助于防止会话 ID 被用户泄露,无论是通过不良会话处理(例如,某些服务器重写 URL 以包含会话 ID,然后可能在 http 引用标头中泄露),或者用户设备上的恶意软件。这有它自己的优点和缺点。攻击者无法利用他们找到的任何会话 ID,除非它们来自同一 IP。但是,如果您的用户使用了一些有趣的负载平衡设置,他们的会话可以合法地来自多个不同的 IP,在这种情况下设置 IP 限制会拒绝他们的服务。

OWASP 提供了更多会话注意事项的深入总结:https://www.owasp.org/index.php/Session_Management_Cheat_Sheet

【讨论】:

    【解决方案2】:

    我想知道在评估之前对会话 ID 进行散列是否会提供额外的安全性?

    是的,确实如此。但仅适用于攻击者只能从数据库中读取任意数据的情况,例如。 g.,通过 SQL 注入,并希望劫持活动会话。在这种情况下,找到散列函数输出值(即存储的会话 ID)的输入值(即传输的会话 ID)将构成pre-image attack。还有一个major goal of cryptographic hash functions is pre-image resistance

    【讨论】:

      猜你喜欢
      • 2015-05-15
      • 2018-05-10
      • 2012-05-06
      • 2021-12-11
      • 2011-04-30
      • 2010-12-28
      • 2010-12-10
      • 2010-12-06
      • 2013-02-03
      相关资源
      最近更新 更多