此 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 的问题。即:
数据库中的令牌经过哈希处理,因此只要攻击者没有对数据库的写入权限,他/她就无法伪造所有用户的 cookie。
使用唯一 ID 而不是用户的帐户名,因为登录凭据不应该存储在 cookie 中。
每次对 cookie 进行身份验证时都会生成一个随机令牌,因此如果攻击者窃取了 cookie,它只会在用户下次登录之前有效,而不是在用户被记住的整个时间内有效。
因为我的整个应用程序都使用 HTTPS,所以 Cookie 将很难被嗅探。
我可以通过允许用户指定他/她希望被记住多长时间来进一步增强安全性。到期日期将存储在存储 uniqueid 和令牌的同一个数据库表中。每次创建新的 cookie 时,此过期时间将与 cookie 一起发送。如果用户尝试使用服务器认为已过期但客户端仍然持有的 cookie 登录,则登录将被拒绝。
我相信这个解决方案是相当安全的,但是当我设计这个方法时,有没有我忽略的陷阱或事情?
资料来源: