移动应用程序的API身份验证(通过短信)

时间:2013-07-22 14:09:47

标签: api security mobile architecture

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

我想到了一个简单的身份验证系统:

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

我有以下问题:

这种方法有什么重大缺陷吗? 假设我们使用HTTPS,它是否足够安全以发送未加密的数据? 访问令牌是否可以安全地存储在移动设备上,以便只有我们的应用程序可以读取它们? 还有其他我们没想过的东西吗?

我们已经发现,当手机被盗或以其他方式受到损害时,数据不再安全,但这是一个难以克服的风险。访问令牌可以暂时有效,以最大限度地降低这种风险。

我假设这种方法很简单,某处有一个巨大的缺陷:)你能开导我吗?

2 个答案:

答案 0 :(得分:5)

有一个缺陷。该系统易受蛮力攻击。

假设我是攻击者。我将为自己生成一个guid并将其与一些任意电话号码一起发送。

接下来,我将通过可能的短信代码强行执行 - 如果它是6位数,那么只有10 ^ 6种组合。暴力行为只需几秒钟 - 然后我将获得持有此手机的人的数据。

此外,正如Filou的评论所指出的,人们可以强迫您向您发送任意数量的短信,从而有效地让您免费承受经济损失。

这次袭击也没有有效的防御措施:

  1. 如果给定UID的尝试数量有限(N),我会的 每N次尝试重新生成一个guid。
  2. 如果每个手机每个时间段的请求数量有限,我可以通过使用虚假请求充斥每个可能的号码来执行DoS / DDoS攻击 - 因此,没有人能够执行任何请求。
  3. 在SMS之前,登录/密码或证书身份验证强制。也:

    1. 切勿在加密/安全协议中使用GUID之类的内容。 GUID是确定性的(即,知道一个值,您可以预测未来的值)。使用crypto-libraries内置函数生成随机流
    2. 永远不要尝试自己设计安全协议。决不。即使是SSL 1.0创建者也有很多警告 - 但他们是敏锐的人,请注意。更好地复制常见且经过验证的方案(Google的auth就是一个很好的例子)。

答案 1 :(得分:0)

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