Authentication 没有电子邮件和密码的身份验证。

Authentication 没有电子邮件和密码的身份验证。,authentication,Authentication,我正在尝试为API建立一个身份验证系统。但与传统方式不同,这将无需电子邮件和密码 前端是一个android应用程序。最初,应用程序在本地存储中将有空的auth_令牌,现在应用程序请求 通过发送手机号码、设备id和gcm id,从服务器发送身份验证令牌 现在,服务器生成一个16 securerandom hex,,并将其作为身份验证令牌发送到前端 现在,前端必须使用此身份验证令牌调用所有API 服务器用户表如下所示 id | | | | | | |设备| | | gcm | | |身份验证|令牌

我正在尝试为API建立一个身份验证系统。但与传统方式不同,这将无需电子邮件和密码

前端是一个android应用程序。最初,应用程序在本地存储中将有空的auth_令牌,现在应用程序请求 通过发送手机号码、设备id和gcm id,从服务器发送身份验证令牌

现在,服务器生成一个
16 securerandom hex,
,并将其作为身份验证令牌发送到前端

现在,前端必须使用此身份验证令牌调用所有API

服务器用户表如下所示

id | | | | | | |设备| | | gcm | | |身份验证|令牌

问题1:

我应该根据手机号码、设备id生成身份验证令牌,还是可以独立生成

问题2:

是否应更改身份验证令牌?或者我可以为用户永久使用相同的身份验证令牌。如果必须改变的话。。你能指导我指出使用哪种策略吗

问题3:


这种身份验证的陷阱是什么。我不希望用户键入电子邮件和密码,但同时希望识别用于个性化计算的用户

问题3:一个陷阱是不加密存储在任何地方的密钥。如果将其存储在数据库(例如用户表)中,则应使用以下方法进行加密:

身份验证令牌是密码。它们通常应设计为由客户端和服务器自动处理,并定期轮换,以降低潜在暴力攻击或凭据泄漏的风险,如通过受损用户设备或其他服务器错误(如Heartbleed)。让您的令牌每隔一段时间(可能是2周或一个月)过期一次,并让客户端应用在令牌过期时要求重新验证,或者在令牌过期之前自动请求刷新令牌

您描述的用户身份验证方案针对的是设备,而不是用户。使用这些详细信息,您将无法可靠地识别一个用户和另一个用户,但这并不是说电子邮件+密码更好,它只是具有不同的使用预期。您通过设备id识别移动设备,并通过验证电话号码来增加其所有者没有改变的信心。我不熟悉GCM,所以我不确定它增加了什么属性。要添加另一个对另一方欺骗来说不那么简单的设备身份验证因素,我建议让您的客户端应用程序生成自己的“您知道的东西”密码,用于请求初始令牌。该设备内部密码可以是其用于自动令牌颁发的服务验证的秘密,并且可以比常规的每请求身份验证令牌更频繁地轮换

对于客户端密码和身份验证令牌,就像密码一样,您应该将它们设置为长且随机的。如果auth令牌是自动旋转的,您可以允许它更短,而不会在一定程度上引入实际风险。我想说,即使对于一个短期令牌,至少16个随机字节也应该是最小的,因为12个字符在实际的脱机哈希暴力强制范围内,并且在今天看似可行的内容和明天的破解能力改进之间有一个相当大的安全窗口是很好的


重要的是要记住,您所描述的内容不会验证一个人,而只是验证一个单独的设备。这听起来像是你打算为你的项目做的事情,但重要的是要理解其区别及其含义。

因此,如果用户的电话断开,他们的帐户将永远无法访问?是的,就这么简单。那么你的意思是说身份验证令牌必须加密?通常是,但如果你不担心它们被错误地使用,那么你的情况可能就不是这样了。那么手机号码和设备id呢?它们也应该加密?这取决于您是否担心它们容易被发现和误用。身份验证令牌是一种密码类型,应该使用密码存储最佳实践进行存储。这意味着使用单向散列函数,如bcrypt或pbkdf2,进行适当配置,并使用安全比较函数进行验证。可逆加密提供了一种泄漏凭据的方法,而不会带来明显的功能优势。