Security 需要cookie来记住双因素身份验证成功(而不是持久登录)

Security 需要cookie来记住双因素身份验证成功(而不是持久登录),security,cookies,two-factor-authentication,Security,Cookies,Two Factor Authentication,我在这里和其他地方读过很多关于使用cookie来实现“记住我”选项的文章,但我要寻找的是一种设计cookie来记录双因素身份验证成功的方法。例如,谷歌就是这样做的:如果第二步成功(例如,您输入了通过短信收到的代码),那么它会在一段时间(例如,30天)内设置一个cookie,这意味着可以绕过第二步。称之为“验证cookie”。我的理解是,如果在此期间您注销,然后再次登录,则不会执行第二步,而只执行第一步。(我测试了这个和那个似乎都是如此。) 我的问题是如何设计这个cookie。一个想法是将用户ID

我在这里和其他地方读过很多关于使用cookie来实现“记住我”选项的文章,但我要寻找的是一种设计cookie来记录双因素身份验证成功的方法。例如,谷歌就是这样做的:如果第二步成功(例如,您输入了通过短信收到的代码),那么它会在一段时间(例如,30天)内设置一个cookie,这意味着可以绕过第二步。称之为“验证cookie”。我的理解是,如果在此期间您注销,然后再次登录,则不会执行第二步,而只执行第一步。(我测试了这个和那个似乎都是如此。)

我的问题是如何设计这个cookie。一个想法是将用户ID和128位随机数放入cookie中,然后将该数字与用户ID一起存储在数据库中。这是Charles Miller为持久登录cookie推荐的()

然而,我认为这还不够好。问题在于,由于用户使用的是双因素授权,因此无论使用何种cookie记录第二步成功,都应该比单因素授权更安全

我想避免的是:破解程序从数据库中获得了哈希/盐密码,并且以某种方式获得了密码。如果他/她有那么多,我假设验证cookie中的128位随机数也可用。(如果破解者以其他方式获得密码,并且没有数据库,那么验证cookie是安全的,除非他/她能够物理访问计算机。我只担心数据库受损的情况。)

也许可以对128位随机数进行加密?(需要是双向的,而不是散列。)应用程序可以访问加密密钥,但可以存储数据库凭据

有没有人实现了我所说的验证cookie(不是持久登录cookie)并能告诉我(我们)是如何实现的


更新:考虑到这一点,我认为足够安全的是:Cookie由userID和128位随机数组成——称之为R


数据库包含密码和R,每个都经过哈希和盐析(例如,使用PhPass)。然后,R被认为是第二个密码。优点:即使第一个密码是错误的(例如,“password1”),R也是一个非常好的密码。数据库真的不能被破解,所以不必担心。(我想这是不必要的担心。)

我想你的计划很好。一般来说,cookie应该是完全随机的,并且不应该包含服务器使用的任何数据。这个想法是,任何由客户控制的东西都可以被篡改。即使当值被加密时,我也看到攻击者旋转比特,并将被篡改的数据解密为不同的用户ID(是的,那一个让我有点害怕)。尽管如此,我认为查理·米勒的建议很好,因为128位是一个很好的熵。就我个人而言,我会选择完全随机的字节作为cookie,这样就不会出现任何模式

验证cookie的最后一个实现是一个完全随机的256位值,以ascii十六进制打印,映射到数据库中的用户ID和会话信息。我们使用密钥对会话信息进行加密,因此,如果攻击者SQL注入我们的数据库,那么这些信息都将是无用的加密信息。当然,DB机器的完全折衷将提供对密钥的访问,但这要困难得多,因为它涉及多个漏洞和数据透视


一些好的建议是不要想得太多。我们遇到了实现问题,因为我们“过度设计”,最终我们没有获得多少安全优势。一个简单的随机数是您所能做的最好的(只要它足够长以提供足够的熵)。

security stackexchange站点上有一个很好的答案来回答这个问题(无论如何,这可能就是这个问题的所在):


我添加了一种将cookie锁定到浏览器的方法:在散列之前,我将称为R的内容与用户代理+一些屏幕属性(DPI、宽度、高度等)连接起来。当然,连接的属性没有一个存储在cookie中,只有R是。因此,如果破解者获得了R,他/她将不得不在具有相同属性的计算机上通过浏览器运行。虽然不完美,但伪造cookie的数据要困难得多。我认为我的方法比很多人做的更好,使用的是IP哈希。IP的变化比浏览器版本或计算机显示器的变化要频繁得多。