【问题标题】:Is appending user id to session id unsafe?将用户 ID 附加到会话 ID 是否不安全?
【发布时间】:2016-08-16 23:26:53
【问题描述】:
假设我有一个加密安全的随机生成的字符串,我将一个分隔符和用户的用户 ID 附加到该字符串并将其用作会话 ID。用例是为了防止碰撞。与只使用随机生成的字符串相比,这是否会使我的系统更不安全?
【问题讨论】:
标签:
security
session
authentication
cryptography
sessionid
【解决方案1】:
让我们把答案分成两个假设:
如果您已经以其他方式(不同的字段、不同的 cookie 等)发送用户 ID,并且可以访问会话 ID 的攻击者可以看到它,那么您的方法不会在实现中添加任何攻击面,并且因此风险保持不变。
如果用户 ID 不会以其他方式发送,那么您就是在向攻击者提供其他信息,这些信息可能会在其他攻击中被滥用。这有多危险取决于用户 ID 在您的应用程序中的重要性。
最后,我担心你的推理。如果有任何合理的数学碰撞机会,那么您的 sessionID 就不足以达到您尝试使用它的目的。为了安全起见,错误。
【解决方案2】:
如果冲突是一种风险,那么您的会话标识符几乎不包含熵以确保安全。
来自OWASP Session Management Cheat Sheet:
如果使用熵为 64 位的会话 ID,它将需要一个
攻击者至少需要 292 年才能成功猜出一个有效的会话 ID,
假设攻击者每秒可以尝试 10,000 次猜测 100,000
Web 应用程序中可用的有效同时会话
因此,如果您的会话标识符无需尝试就可以成功猜出,那么您将遇到更大的问题。如果系统本身生成的标识符发生冲突,则需要紧急审查您的熵源。
为了回答您的问题,引入用户 ID 的风险在于,如果您的会话标识符被泄露,攻击者可以立即识别出多汁的标识符。也就是说,那些管理员或 root 帐户。此外,当您添加代码来执行此操作时,应用程序的复杂性会增加。当尽可能简单地解决应用程序面临的风险时,安全性是最好的。额外的代码意味着更多的攻击面,以及实现漏洞的额外可能性。
总之,确保您的会话标识符具有至少 64 位的熵并且熵源良好(例如,使用 CSPRNG 而不是 PRNG 或使用您的应用程序独有的熵源)。