如何安全地实现自动登录


15

我读过很多,很多,很多关于如何“你可能会存储密码错”的帖子。他们总是指在用户登录的服务器上存储密码。他们基本上会重新编码(确保使用双关语)无处不在的建议,例如确保对密码加盐等。但是,我从未见过有关在客户端上存储密码的最佳实践的文章,这样客户端不必登录每次他们要登录时手动进行;“记住我”功能。

从浏览器到诸如Dropbox之类的程序,许多软件都具有此功能。

我最近确实读过一篇老文章,内容涉及Dropbox如何在您的计算机上存储ID,您可以将其复制/粘贴到另一台计算机上,然后启动Dropbox并以从中获得ID的设备身份登录。没有登录,什么都没有,并且对Dropbox帐户具有完全访问权限。这似乎是一个非常愚蠢的设计,但是我想不出任何更好的方法来做到这一点。

我什至不知道如何避免以纯文本形式存储像cookie之类的东西。如果您对其进行加密,那么将密钥存储在何处?

我认为不引入安全漏洞的唯一方法是删除自动登录功能,并让用户每次想要使用服务时都输入密码,但这是在可用性方面的努力,并且用户不愿意这样做而被宠坏了。

关于安全地本地存储凭据以实现自动登录功能,我可以读到什么?如果原则对于整篇文章来说太简单了,那是什么?有问题的软件不应依赖于并非所有平台都具有的功能(例如某些Linux发行版具有的“钥匙串”)。


2
这与您的信任有关。如果您不信任机器存储的ID,那就是您的问题。如果您信任钥匙串,那么您将获得最大的安全性。当然,您可以添加一些自定义安全性,例如检测设备硬件之类的东西,但是它们都是可伪造的,因此最终无法知道。这是您无法控制的。当然,排除了保存明文密码之类的愚蠢行为。
Luc Franken

@LucFranken您如何信任机器?有人可以像利用保管箱那样利用您。我也相信钥匙串,但并非所有计算机都有钥匙串,而Windows从来没有(AFAIK)。如果要存储密码,如何避免以明文形式存储密码?如果对它们进行加密,那么将密钥存储在何处?
杰·西蒙

这就是问题所在,您不能相信。用户只能定义信任它。考虑到用户了解他的机器的安全性。写病毒从Dropbox获取数据是可能的。与本地存储的密钥和其他本地数据相同。您可以帮助使其更安全(考虑需要5码的应用程序),但最终它是本地的,不受您的控制。
Luc Franken

@LucFranken只是我还是自动登录似乎无处不在?如果是这样,人们为什么还没有写关于如何做对的文章?
杰·西蒙

尽管有些企业软件不允许这样做,但这是一个很常见的要求。例如,SalesForce只允许保存用户名,而不保存密码。顺便说一句。您无需在客户端存储密码即可登录。您可以在服务器上存储与哈希相对应的随机哈希。
Luc Franken

Answers:


12

一种方法是:

  • 用户登录时,将会话ID存储在客户端计算机上的cookie中(而不是用户名或密码)。
  • 将会话绑定到IP地址,因此单个会话ID仅适用于启动该会话的计算机。

根据您用于开发网站的框架的不同,此行为可能作为内置功能提供。

请注意,由于HTTP协议无论如何都是无状态的,因此,在某人使用网站的一次会话中保持某人登录与他们下次使用该网站时“自动登录”之间,实际上并没有功能上的区别。这完全取决于您在会话期满之前允许多少时间。

更新:另外,显然,请使用HTTPS来提高安全性。

更新2:请注意,这种方法有局限性,因为它对于大量更改其IP地址的用户来说效果不佳。但是,它确实提供了更高级别的安全性,并且在某些情况下可能很有用。


1
将其绑定到IP地址并没有多大帮助,因为某人可能拥有与您位于同一防火墙后的计算机。
杰·西蒙

2
@JaySimon,我不会说“没有太大帮助”。与您相同的防火墙后面的计算机数量大大少于世界上的计算机数量。这是关于限制您可能遭受攻击的机会,这将极大地限制它。这是一种标准方法,我真的不认为您可以做很多事。如果某人与用户具有相同的IP地址设法获得会话ID,则从服务器的角度来看,该人与用户将无法区分。如果您的网站上有任何类型的登录,则您很容易受到这种攻击。

3
您是否认为这种方法会使IP地址可能经常更改的手机用户烦恼?
杰·西蒙

@JaySimon,如果它在会话中发生,则用户会突然注销,而这无疑会很烦人。不过,我不知道它们实际更改的频率(快速的Google搜索无法显示确切的答案)。除非IP在他们实际使用时可能会更改,否则我不会太担心。

如上所述,将会话限制为IP并不现实。用户经常更改位置。既有手机,也有笔记本电脑;例如弹性工作。您可以做的最好的事情就是结合一些GeoIP检查和行驶该距离的时间。就像Gmail一样。
2013年

5

亚马逊(和许多其他公司)使用混合方法。他们提供了用于登录的自动登录,将商品添加到购物车以及使用您之前使用过的信用关怀/收货地址组合下订单。但是,它们要求您输入密码才能执行许多操作,例如添加信用卡,添加/更改收货地址,更新密码,查看过往订单(对用户而言可选)以及许多其他帐户设置。

是的,可以访问您计算机的人可以劫持您的会话,但是您仍然可以得到他们所订购的东西!(更重要的是,劫持会话的动机几乎被否定了。)但是,如果有人可以访问我的计算机,那么与窃取平均站点会话的用户相比,我面临的问题更大。

如果您的应用程序中某些部分不需要很高的安全性,则可以选择一种混合模型,在该模型中存储会话ID(哈希或任意一种),以自动将用户登录到网站的低安全性部分,但要求他们在进入更高安全性区域时输入密码,并在会话结束时删除高安全性令牌。

当然,如果这是银行级别的网站,则不能选择自动登录。同样,使用这些类型的安全性的站点将假定它们所保护的数据的价值,并且为用户带来的额外便利权衡了会话被劫持的潜在风险。如果您觉得应用程序不是这种情况,请不要实施自动登录。您需要访问适合您的用例的安全/可用性级别的权衡。


2

实际上并不难。首先使用以下格式存储Cookie:

userID.token

您可以将sha1哈希用于令牌。然后在您的Remember_me_tokens数据库表中存储userID,令牌的bcrypt哈希值和令牌的生成时间。

然后,当有人访问您的网站时,请检查Cookie是否已设置。如果设置了cookie,则说最近7天内数据库中是否有有效的行。如果数据库中存在cookie的有效行,则将会话设置为指示用户已登录,并删除匹配的cookie /数据库行,并生成新的cookie /令牌/数据库行。

如果他们注销,则删除cookie。

运行cron作业以修剪7天之前的Remember_me_token。


是什么阻止某人复制此密钥并粘贴到他们的计算机上,而无需用户名或密码即可访问该帐户?
杰·西蒙

您将如何获得钥匙?它存储在本地的某人的计算机上。
瑞安(Ryan)

您走到计算机上并打开了文件的存储位置:)
Jay Simon

2
@JaySimon可以为登录并在不锁定计算机的情况下走开5分钟或单击“记住我”并且有人跳入其帐户密​​码的某人提供相同的参数。如果您可以接受这种可能的安全情况,那么它的便利就很好了,但这就是为什么您在CIA NOC列表上看不到“记住我”功能的原因:)服务器必须为您提供某种客户端必须存储的令牌在文件系统上。从服务器的角度来看,它不再在您手中。
maple_shaft

@maple_shaft为什么有人会对您可以对保管箱做到这一点感到惊讶?(我在问题中将其链接。)
Jay Simon 2013年

0

仅当您信任存储设备的设备时,才可以。用户的安全性(取决于您是否可以影响设备)取决于用户。它完全不在您手中。

如评论中所述:

这与您的信任有关。如果您不信任机器存储的ID,那就是您的问题。如果您信任钥匙串,那么您将获得最大的安全性。当然,您可以添加一些自定义安全性,例如检测设备硬件之类的东西,但是它们都是可伪造的,因此最终无法知道。这是您无法控制的。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.