2013-07-22 54 views
6

我们目前的任务是使用RESTful API实现移动应用程序通信(最好是简单的)身份验证系统。后端具有用户特定的数据,由用户的电话号码标识。我试图更多地了解安全性,不同的方法以及他们为什么以他们的工作方式工作。使用移动应用程序进行API身份验证(通过SMS)

我认为一个简单的认证系统的:

  • 客户端发送的验证请求,以包括他们的电话号码和一个生成的GUID的API。
  • 服务器使用验证码向手机号码发送短信。
  • 客户端通过发送其唯一的GUID,电话号码和验证码来验证他们的设备。
  • 服务器响应某种访问令牌,客户端可以使用该令牌来进一步请求。

我有以下问题:

是否有这种做法的任何重大缺陷? 假设我们使用HTTPS,它是否足够安全地发送数据,否则未加密? 可以将访问令牌安全地存储在移动设备上,以便只有我们的应用可以读取它们? 还有什么我们没有想到的?

我们已经认识到,当手机被盗或被盗用时,数据不再安全,但这是一个难以克服的风险。访问令牌可以暂时有效,以最大限度地降低此风险。

我认为这种方法是简单的方法,有一个巨大的缺陷:)你能指导我吗?

+0

您可能有兴趣在阅读oauth2.0 - http://oauth.net/2/这是当前的认证趋势。基本上,客户端打开后会打开一个由服务提供商维护的网页,供用户登录他/她的账户,客户端被重定向到一个接收访问代码的页面(短时间可用),然后代码被交换为一对访问令牌和刷新令牌。访问令牌用于访问用户的帐户和刷新令牌 - 刷新访问令牌。 – stan0

+0

我已阅读oauth,但我不认为它适合我们。我们不允许通过第三方认证系统进行登录,所以看起来像是过度杀毒。用户没有用户名和密码,我们只需要确认他们有权访问输入的电话号码(因此验证短信)。他们可以访问的数据也与电话号码相关联。 – Dennisch

+0

我的观点是你描述了一个类似于oauth2.0的认证系统。也许oauth的优点和缺点(访问令牌,安全性等)对你的系统有效 – stan0

回答

4

有一个缺陷。该系统容易受到暴力攻击。

假设我是攻击者。我会为自己生成一个GUID,并随同一些任意的电话号码一起发送。

接下来,我将通过可能的短信代码强制我的方式 - 如果是6位数字,则只有10^6个组合。暴力行为只需几秒钟 - 然后我就可以获取有此电话的人的数据。

另外,正如Filou在评论中指出的那样,人们可以强迫您发送任意数量的短信,实际上使您免费承受经济损失。

还有从这次攻击中没有有效的防御:

  1. 如果试图对一个给定的UID的数量有限(N),我会 重新生成GUID中的每N次尝试。
  2. 如果每个电话的时间请求数量有限制,我可以通过用虚假请求淹没每个可能的号码来执行DoS/DDoS攻击 - 因此,任何人都无法执行任何请求。

SMS之前的登录名/密码或证书认证是强制性。另外:

  1. 千万不要在加密/安全协议中使用像GUID之类的东西。 GUID是确定性的(即知道一个值,你可以预测未来的值)。使用加密库内置函数生成随机流
  2. 永远不要试图自己设计安全协议。决不。即使SSL 1.0的创作者都陷入了困境 - 他们是尖锐的人,但是还是有很多警告。更好地复制通用和经过验证的方案(Google的身份验证就是一个很好的例子)。
+0

1.是的,但即使在你的例子中,给定一个小的N,N/10^6接近零,尽管肯定不是零。所以问题是如果手动输入验证码,即它有多复杂? 2.你没有提到发送不受控制数量的短信的经济损失,所以你可能需要一个反措施。如果用户,即GUID /电话,注册是安全的,我认为它会起作用,其他方面(或甚至为了更安全)事先按照建议使用登录名/密码。几乎也是谷歌在其两步验证方法中所做的。 – Filou

+0

没有“N”。 10^6是可能的SMS代码的数量。如果短信代码很长(至少需要10个符号 - 特殊字母+字母数字 - 才能使其接近2^64个组合,这比“平均水平,但仍然不好”),但密码可能会取代SMS 。请记住,Google *在SMS/OTP步骤之前有*密码认证。 – DarkWanderer

+0

梅没有看到你的完整答复.. 10^6是可能的短信代码的数量,商定。 N是在采取某种措施之前对给定的UID和验证码的有限尝试次数。所以猜测正确或使用蛮力的概率在N/10^6左右,或者我错了?对打字错误宽松并允许M次重试会导致约1 - ((10^6-N)/ 10^6)^ M的成功概率,除非您过于宽松,否则这个概率仍然相对较小。如果这是长时间的攻击,那可能会绕过任何这样的对策,但这是一个不同的故事..? – Filou

0

您提到的方法将正常工作。客户端将用电话号码和随机ID发起请求,服务器向设备返回验证令牌。令牌一次只能在设置过期时使用。然后,客户端将发送电话号码,之前使用的随机令牌和服务器验证的验证令牌。如果有效,服务器将发送会话令牌(或授权令牌)或可用于认证的类似信息。会话令牌可以从服务器设置超时。
你没有提到它是否是一个网络应用程序。如果它是一个Web应用程序,则可以从服务器设置一个仅限https的会话Cookie。否则,您可以将其存储在本地应用程序的本地商店中。通常情况下,应用程序无法读取属于其他应用程序的私人数据。
所有通信都必须使用HTTPS进行。否则,整个方案可能会通过嗅探流量而受到威胁,因为最终您使用的是身份验证令牌。

相关问题