2

此 Web 应用程序将有一个数据库表,其中包含 uniqueid 列(64 位 int 自动增量字段;键)、令牌(64 字节二进制字段)和一个 accountid。

选中“记住我”登录后,将生成一个随机令牌。然后这个令牌的 SHA-512 哈希将被插入到数据库中,并检索生成的 uniqueid。包含唯一标识和未散列令牌的 cookie 被发送到客户端。

每次用户访问带有 cookie 的页面时,都会根据数据库检查 cookie 的 uniqueid 及其令牌的 SHA-512 哈希值。如果有一行与 uniqueid 匹配,并且该行的令牌哈希与令牌哈希匹配,则使用该行的 accountid 登录用户。在 cookie 进行每次身份验证尝试后,删除使用旧唯一标识的行,如果身份验证成功,则生成新的随机令牌。然后这个令牌的 SHA-512 哈希将被插入到数据库中,并检索生成的 uniqueid。包含唯一标识和未散列令牌的 cookie 被发送到成功通过身份验证的客户端。

我也将使用这里描述的技术。所有失败的 cookie 身份验证都将 cookie 设置为空白值,并将过期日期设置为过去的某个时间。

我相信这种方法可以解决一些关于 cookie 的问题。即:

  1. 数据库中的令牌经过哈希处理,因此只要攻击者没有对数据库的写入权限,他/她就无法伪造所有用户的 cookie。

  2. 使用唯一 ID 而不是用户的帐户名,因为登录凭据不应该存储在 cookie 中。

  3. 每次对 cookie 进行身份验证时都会生成一个随机令牌,因此如果攻击者窃取了 cookie,它只会在用户下次登录之前有效,而不是在用户被记住的整个时间内有效。

  4. 因为我的整个应用程序都使用 HTTPS,所以 Cookie 将很难被嗅探。

我可以通过允许用户指定他/她希望被记住多长时间来进一步增强安全性。到期日期将存储在存储 uniqueid 和令牌的同一个数据库表中。每次创建新的 cookie 时,此过期时间将与 cookie 一起发送。如果用户尝试使用服务器认为已过期但客户端仍然持有的 cookie 登录,则登录将被拒绝。

我相信这个解决方案是相当安全的,但是当我设计这个方法时,有没有我忽略的陷阱或事情?

资料来源:

数据库中的哈希令牌

不要将帐户名称存储在 cookie 中,并在每次身份验证后使用新的唯一 ID

4

1 回答 1

1

谈到安全性,合理总是相对的。:) 如果您认为与您面临的威胁相比,它是适当的,那是合理的。也就是说,如果它是我的应用程序,我会做一些事情,并且我相信我实际上需要保护它免受攻击......

  • 在令牌/b/e 中添加一些内容,使您可以关联回原始身份验证事件,然后将其记录到所有 cookie 操作中。这样,如果(何时:))人们被黑客入侵并且您想弄清楚何时发生了什么,您就可以进行关联。
  • 在 b/e 上,确保您实施“使我所有未完成的令牌无效”作为系统的一项功能。然后将其自动连接到所有“可疑”事件。
  • 将地理信息存储在 cookie / b/e 中与 cookie 对应的行中。从记录它开始。最终你会想做更多。当您研究被黑客入侵的人时,您会发现可以使用这些数据做的事情越来越多。如果你没有数据,你就无法学习。
  • 很多仪器。很多很多的仪器。保留多年。一切都有一个事件,当它发生时,记录你在那个事件中知道的一切。良好的可视化/查找工具,您可以使用它们来找出发生了什么时间。

当然,您还可以做更多的事情,这只是一个入门列表......

于 2012-10-20T16:36:04.247 回答