我想创建一个简单的REST Web应用程序,用户通过电子邮件中的链接与对象进行交互。这些链接有一个令牌,可用于在没有用户名和密码的情况下对用户进行身份验证,例如通常用于重置密码的用户和密码。
此类无登名,基于令牌的身份验证系统的最佳做法是什么?
答案 0 :(得分:8)
我是没有意味着安全专家..但是我想到的一些要点是 -
终身 - 令牌应在一段时间后过期。使用令牌的无限期访问当然没有意义。
重播攻击 - 该机制应该阻止重播攻击..这意味着令牌不仅应该在一段时间内有效,而且还应该是固定的呼叫数量。理想情况下正好1.如果这个数字不是1,那么它会打开另一种蠕虫..
除非,它的一个特点:(例如,根据设计,用户应与其他人共享链接,任何有链接的人都应该能够访问相关资源。
授权 - 令牌授予的访问权限的粒度。它是黑色还是白色..或者是令牌还与一组固定的权利相关联。例如,对于具有R / W访问权限的相同资源,发出了令牌X以进行只读访问,而发出了令牌Y.
管理 - 用户/管理员应该能够查看并验证任何当前有效和已发放的令牌以及相关信息(授予权限/受影响的资源等),并明确撤消它们,如果必要的。
安全通信 - 您应该考虑将带有令牌的网址发送给用户的媒体的安全性。即在您的方案中,用户是否通过安全通道(TLS / SSL)接收电子邮件?电子邮件本身应该受DRM保护吗?
中间人/泄漏 - 同样,即使您在电子邮件中提供网址,并且用户未通过SSL使用用户名和密码登录,资源也应该仍然可以使用带有令牌的URL通过SSL访问。这将阻止中间人从网址捕获令牌。您还需要非常小心用户浏览器何时可以在您不期望的地方使用此URL。
我可以模糊地回忆一下在网站上展示广告时,一个受其网址影响的热门网站正在被用作推荐网址。这意味着,广告客户网站可能会获得带有令牌的网址作为推荐。
生成 - 选择生成令牌的算法 - 看起来很明显,但令牌应该非常模糊,几乎不可能猜测或暴力。永远不应该重复使用令牌,算法应该避免冲突。
服务器端安全性 - 应该使用与保护用户ID和密码相同的安全性来处理令牌。如果您的用户数据库被黑客攻击,黑客不应该获取用户密码和其他敏感信息。同样,如果您的用户/资源/令牌数据库被黑客入侵,尽管令牌过期,黑客应该无法访问资源用户x小时。 重点是,当令牌存储在服务器端时,它们本身应该被保护/加密。
在同样的路线上..就像在日志文件(特别是纯文本)中记录密码等信息的不良做法一样,您还必须考虑在服务器上记录这些URL的任何地方(纯文本)。例如,Web服务器日志。如果只有超级管理员可以访问用户的数据库,那么他们也应该是唯一能够看到这些令牌的人。不是你的网络服务器管理员,也不是任何黑客在黑客攻击后解析日志文件。
审核 - 如果需要审核,您需要一些机制来证明用户没有登录对于系统,他们确实是执行有关行动/操作的人。您是否希望跟踪IP地址和其他信息以及有助于此类审核的请求?
同意 - 您的用户是否同意使用此类替代身份验证和授权方式?这应该是可选的/选择加入功能吗?
编辑:我发现了link我正在回忆的引荐来源网址问题。虽然它是在用户信息的背景下。
答案 1 :(得分:4)
我同意维卡的10分,但从安全的角度来看,我必须告诉你几点,你必须小心。
我会尽量保持简单。在这里,我将技术内容简化为您的特殊情况。
首先,令牌用于防止跨站请求伪造攻击(XSRF)。记住这一点。如果表单上没有唯一令牌的Web平台,则任何攻击者都可以强制用户发出恶意请求。
如果您只是尝试使用令牌对用户进行身份验证,那么这是非常错误的。因为必须没有简单的身份验证过程,所以您不能依赖令牌。
以下是登录系统在官方安全文档中的工作方式,我记得我写的:
标识:您必须首先识别用户,通常使用用户名来完成。你会知道你的系统中存在用户。
身份验证:假设您已经确定用户A想要登录。因此,您使用您知道且用户A知道的内容对用户A进行身份验证。我们简称为密码:)你不能通过纯文本方法传递这一步。密码通常在您的数据库中加密,并通过与安全证书的所有通信进行加密,请检查ssl。
授权:好的,您以某种方式进行了身份验证,用户有权获得授权。假设管理员类型用户已登录,他有不同的条件,如果普通用户登录,则她有常规权限。
会话控制:最后,您必须以安全的方式控制会话。这里通常在Web应用程序中,人们对所有请求使用访问令牌以确保授权用户知道该请求。作为平台所有者,您有责任在会话结束前保护所有内容。如果你不满足用户的安全性,那么你的平台可能不会存活更久。
令牌有不同的生存期到期和不同的访问权限。
现在让我们来看看公司对移动应用的看法。对于移动应用程序,他们生成一个独特的访问令牌,它总是存活。这里的一个缺点是,如果任何攻击者通常窃取移动令牌,她可以随时在帐户中执行任何操作:)无论如何,我们的观点是他们如何使用这些令牌验证用户;首先,令牌对于该设备是唯一的。 (实际上并不完全独特或不依赖于硬件,因为如果你清楚地从设备窃取必要的文件,那么你可以在另一部手机上使用它)。因此,使用这个唯一的访问令牌,它是在用户首次登录移动应用时使用密码生成的,他们可以随时自动登录。这种方法与您想要做的有点类似。但请注意,他们不会使用链接或电子邮件代码对用户进行身份验证。
验证不是身份验证,请不要忘记。通过发送电子邮件,您可以验证用户是否电子邮件代码是唯一且有效仅30秒或1分钟。我希望你明白这一点。
我建议您在多个域中查看单点登录,这非常有趣。 Single Sign On across multiple domains 假设您已登录google.com然后访问youtube.com Opps youtube已登录?是的,很酷的权利,但存在很长一段时间。他们可以通过一些安全的技巧来验证使用不同cookie的域中的用户。您将在链接上阅读。
如果您的服务不是真正的机密,并且您希望通过简易登录系统让您的用户满意。以下是我解决方案的两个,我很喜欢:)
1-)向用户询问他们的电子邮件地址:直接发送4-6位数码作为电子邮件。要求用户输入/点击它。根本没有密码,每次登录时只有唯一的代码。
2-)假设您需要以比电子邮件更强的方式验证用户。然后手机:)这里的伎俩是;您不会将验证码发送给用户,但他们会将您告诉他们的内容发送给您。 要求用户将带有唯一代码的短信发送到XXXXXX您的号码:)将您的移动运营商与您的网络服务连接,并检查用户是否将代码发送给您:)
在安全性和简单性之间以及复杂性之间总是需要权衡。你必须找到平衡点。
如果您的安全性消失,请不要试图简化。
如果它看起来更安全,请不要试图让它变得复杂。
希望这些信息可以帮助你。