此Web应用程序将具有一个数据库表,其中包含uniqueid(64位int自动增量字段;键),令牌(64字节二进制字段)和accountid。
登录“记住我”后,将生成一个随机令牌。然后,将此令牌的SHA-512哈希值插入到数据库中,并检索生成的唯一ID。包含唯一ID和未散列令牌的cookie将发送到客户端。
每次用户使用cookie访问页面时,都会根据数据库检查cookie的uniqueid及其令牌的SHA-512哈希值。如果有一行与uniqueid匹配,并且该行的令牌哈希与令牌哈希匹配,请使用行的accountid登录用户。在cookie执行每次身份验证后,删除使用旧uniqueid的行,如果身份验证成功,则生成新的随机令牌。然后,将此令牌的SHA-512哈希值插入到数据库中,并检索生成的唯一ID。包含uniqueid和unhashed令牌的cookie将发送到成功通过身份验证的客户端。
我将使用here描述的技术。所有失败的cookie身份验证都会将Cookie设置为空值,并将过期日期设置为过去的某个时间。
我相信这种方法可以解决一些关于cookie的问题。即:
对数据库中的令牌进行哈希处理,以便只要攻击者没有对数据库的写访问权限,他/她将无法伪造 所有用户。
使用唯一ID代替用户的帐户名,因为登录 凭证永远不应存储在cookie中。
每次验证cookie时都会生成一个随机令牌 因此,如果攻击者窃取了一个cookie,它只会在有效期之前有效 用户接下来登录而不是用户的整个时间 记住。
Cookie很难嗅探,因为我的整个应用程序都使用HTTPS。
我可以通过允许用户指定他/她想要记住的时间来进一步增强安全性。到期日期将存储在存储uniqueid和令牌的同一数据库表中。每次创建新cookie时,此过期都将随cookie一起发送。如果用户尝试使用服务器认为已过期但客户端仍然保留的cookie登录,则登录将被拒绝。
我相信这个解决方案相当安全,但是在我设计这种方法时,是否存在任何我忽略的陷阱或事情?
来源:
Don't store account name in cookies and use new unique id after every authentication
答案 0 :(得分:1)
说到安全性,合理的总是相对的。 :)如果你认为它适合你面临的威胁是合理的。也就是说,如果这是我的应用程序,我会做的一些事情,我相信我实际上需要保护它免受攻击......
当然,你可以做更多的事情,这只是一个入门名单......