Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用移动应用程序进行API身份验证(通过短信)_Api_Security_Mobile_Architecture - Fatal编程技术网

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

使用移动应用程序进行API身份验证(通过短信),api,security,mobile,architecture,Api,Security,Mobile,Architecture,我们目前的任务是使用RESTful API为移动应用程序通信实现(最好是简单的)身份验证系统。后端具有特定于用户的数据,由用户的电话号码标识。我正试图更多地了解安全性的一般情况、不同的方法以及它们为何以这种方式工作 我想到了一个简单的身份验证系统: 客户端向api发送一个验证请求,其中包括他们的电话号码和生成的guid 服务器向电话号码发送带有验证码的SMS消息 客户端通过发送其唯一的guid、电话号码和验证码来验证其设备 服务器使用某种访问令牌进行响应,客户端可以使用该令牌进行进一步请求

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

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

  • 客户端向api发送一个验证请求,其中包括他们的电话号码和生成的guid
  • 服务器向电话号码发送带有验证码的SMS消息
  • 客户端通过发送其唯一的guid、电话号码和验证码来验证其设备
  • 服务器使用某种访问令牌进行响应,客户端可以使用该令牌进行进一步请求
我有以下问题:

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

我们已经计算出,当手机被盗或以其他方式受损时,数据不再安全,但这是一个难以克服的风险。访问令牌可以暂时有效,以最小化此风险


我认为这种方法很简单,但在某些地方有一个巨大的缺陷:)你能给我一些启发吗?

你提到的方法很好用。客户端将启动一个带有电话号码和随机id的请求,服务器将向设备返回一个验证令牌。该令牌只能在设定的到期日内一次性使用。然后,客户机将发送电话号码、之前使用的随机令牌和服务器验证的验证令牌。如果有效,服务器将发送一个会话令牌(或身份验证令牌)或类似的可用于身份验证的令牌。会话令牌可以从服务器设置超时。
你没有提到它是否是一个网络应用。如果是web应用程序,则可以从服务器设置仅限https的会话cookie。否则,您可以将其本地存储在应用程序的本地存储中。通常情况下,应用程序无法读取属于其他应用程序的私有数据。

所有通信必须使用HTTPS进行。否则,整个方案可能会通过嗅探流量而受损,因为最终您使用的是身份验证令牌。

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

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

接下来,我将对可能的短信代码进行暴力破解——如果是6位数字,则只有10^6个组合。暴力只需几秒钟,然后我就可以访问拥有这部手机的人的数据

此外,正如菲卢在评论中指出的那样,你可以强迫你发送任意数量的短信,有效地让你免费承受经济损失

此攻击也没有有效的防御:

  • 如果给定UID的尝试次数有限(N),我将 每N次尝试重新生成guid
  • 如果每部电话每段时间的请求数量有限制,我可以通过向每个可能的号码发送虚假请求来执行DoS/DDoS攻击,因此,没有人能够执行任何请求
  • 在SMS之前,必须进行登录/密码或证书验证。此外:

  • 不要在加密/安全协议中使用GUID之类的东西。guid是确定性的(即,知道一个值,就可以预测未来的值)。使用加密库内置函数生成随机流
  • 不要试图自己设计安全协议。从未。即使是SSL 1.0的创建者也会遇到很多警告——请注意,他们都是精明的家伙。更好地复制常见且经验证的方案(Google的auth就是一个很好的例子)

  • 您可能对阅读oauth2.0感兴趣-这是身份验证的当前趋势。基本上,客户端打开一个由服务提供商维护的网页,供用户登录他/她的帐户,客户端被重定向到一个页面,在该页面上接收访问代码(短时间可用),然后将该代码交换为一对访问令牌和刷新令牌。访问令牌用于访问用户的帐户,刷新令牌用于刷新访问令牌。我读过oauth,但我认为它不适合我们。我们不允许通过第三方身份验证系统登录,所以这似乎有些过分。用户没有用户名和密码,我们只需要验证他们是否有权访问输入的电话号码(因此验证短信)。他们可以访问的数据也与电话号码有关。我的观点是,您描述了一个类似于oauth2.0的身份验证系统。也许oauth的优点和缺点(访问令牌、安全性等)对您的系统是有效的您的系统听起来很像谷歌的双因素身份验证。主要的区别在于你没有说你如何知道手机是适合这个人的。在谷歌的设置中,用户必须使用他们的用户/通行证来放入手机,然后将其关联。我要强调的主要弱点是你自己提出的,即代币在一定时间内是有效的,这是你可以控制的。因此,您可能需要某种撤销API来帮助处理丢失手机的情况。1。是的,但即使在你的例子中,给定一个很小的N,N/10^6也接近于零,尽管公认不是零。因此,问题是验证码是否是手动输入的,即它有多复杂?2.您没有提到发送数量不受控制的短信会造成经济损失,因此您可能需要采取应对措施。如果用户,即GUID/电话,注册是安全的,我认为它将工作,其他明智的(甚至更多的s)