我正在尝试确定在我验证登录正确后让某人登录我的网站的最佳方法。
我试着看看"Keep Me Logged In" - the best approach,其中最受欢迎的答案说我应该生成一个令牌,然后将此令牌存储在数据库中!当然这完全是不安全的,因为所有需要的是数据库黑客和cookie编辑才能进入别人的账户?
有人可以向我提供目前最新的安全方式吗?感谢。
答案 0 :(得分:4)
我们最近发布了一篇关于secure authentication with long-term persistence(又名“记住我”)的博客,但此博客帖子与ircmaxell's answer to "Keep Me Logged In" - the best approach之间的最大区别是查找的分离(不是{{3} })和验证(这是恒定时间)。
在我们博客文章中概述的策略中,您没有在数据库中存储令牌,而是存储令牌的SHA-256哈希值。如果攻击者泄露了这些值,他必须破解SHA-256哈希的强随机令牌。他们最好只启动一个反向shell,让他们可以像任何用户一样进行身份验证(或者继续使用本地内核利用来接管整个机器)。
使用bcrypt。具体为password_verify()
。 不要生成自己的盐。
如果您想加倍努力,请考虑使用此constant-time库来加密密码哈希值(如果您将数据库和网络服务器放在不同的硬件上,这将非常有用,因为妥协数据库不会给他们加密密钥)。
登录时:
rememberme
Cookie中。rememberme
cookie,请抓取标识符并进行数据库搜索。hash_equals()
将Cookie提供的令牌的哈希值与数据库中的SHA256哈希值进行比较。答案 1 :(得分:1)
以明文形式将生成的令牌存储在数据库中显然是一种风险,但通常被认为是可接受的。一种缓解技术是要求用户在执行敏感操作之前重新进行身份验证。例如,在我修改帐户详细信息之前,亚马逊似乎要求我输入密码,除非我最近输入了密码。