一个会话密钥应用于安全性多少个字符



我正在使用以下功能生成要在cookie中存储的会话键:

function getRandomKey($length=32) { 
  $string = '';
  $characters = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
  for ($i = 0; $i < $length; $i++) {
     $string .= $characters[mt_rand(0, strlen($characters)-1)];
  }
  return $string;
}

如果我要生成一个1位密钥,它将具有:26小写 26大写 0-10 = 62个选项。因此,8位密钥将具有62^8或218,340,105,584,896可能的组合。

1(关于我应该走多少个字符有任何经验法则?我知道,越好,但是8,或者应该更像32个字符,64等。?

2(使用localstorage时是否有任何安全问题?

预先感谢!

这是两个非常不同的问题。

1(tl; dr:大多数目的都可以。

首先,如果可以的话,请避免实施会话管理。它已经在许多框架中完成,包括会话ID的生成等等 - 如果可以的话,请使用现有的,众所周知的实现,因为将其正确处理并不简单。

现在,一切都与熵有关。您是通过计算可能组合的数量开始的。如果您使用Log2,则会得到该会话ID具有多少位熵。(好吧,让我们在这里不要进入熵...(

因此,一个对案例敏感的字母数字字符([A-ZA-Z0-9](具有log2(62(= 5.9542位的熵,两个字符两次多两次,等等。

>

攻击者猜测有效会话ID所需的时间是:

(2^b 1(/(2 * n * s(

其中" b"是会话ID中的熵的可用位,'n'是攻击者可以每一秒钟进行的猜测,而's'是系统中有效的会话ID的数量。p>在一个大型分布式Web应用程序中,有可能使用僵尸网络,攻击者可能能够使N = 100000猜测一秒钟,并且可能有s = 100万个有效的会话ID。您希望结果至少是几百年,例如300(15768000000秒(。(这些是完全任意的。(

这给出了大约B = 70,因此您需要70位熵。如果每个字符具有上述5.9542位的熵,则为所需的会话ID长度提供约12个,但是您只需将其围绕16个以确保。:(

作为经验法则,有时假定会话ID中的熵位是该会话ID的一半(位(。这主要是一个合理的近似值,没有任何计算。:)更重要的是,因为Sessuion ID有时是实际的随机数base64或其他编码。不过,不同的编码通常会产生不同的结果。

还确保使用加密随机数生成器,否则熵要少得多。请注意,mt_rand()不是密码随机,因此您的问题中的代码很脆弱!

2(tl; dr yes。(我想您是说使用本地存储存储会话ID。(

存储会话ID的最佳位置是无效的httponly,安全的cookie(非持久性(,因为JavaScript无法在此处访问(例如,跨站点脚本不会影响受害者用户的会话ID至少(,并且是非持久性的,当用户关闭浏览器并且不会持续到磁盘时,它将被删除(嗯,大多数是...但这是一个长话(。

如果您使用localstorage,则任何XSS都会直接影响会话ID,这对于攻击者来说非常有价值。此外,会议将在关闭浏览器的情况下幸存下来,这有点出乎意料 - 用户可能很容易在共享计算机上劫持。

请注意,这取决于用例和您要承担的风险。尽管对于您可以访问和管理非常敏感的数据的财务应用程序来说,确定性是不可能的,但对于较小的风险应用程序来说,这是可以的。您还可以让用户决定(在这种情况下,将其放入LocalStorage(,但是大多数用户不知道相关的风险,因此他们无法做出明智的决定。

还请注意,SessionStorage有点好一些,因为关闭时会话ID将从浏览器中删除,但仍可用于JavaScript(XSS(。

最新更新