如何安全地传输验证码

时间:2013-07-26 10:25:09

标签: java objective-c encryption client-server restkit

我正在使用iOS应用程序和基于SMS的验证系统来验证用户的电话号码。

为此建议我在设备上生成随机数。这个号码我想通过短信再次发送到设备。我的问题是我如何通过网络传输这个号码?如果some1使用Wireshark,他很容易看到Verification-Code。我想了两个方法:

方式1(设备< - > SMS-Gateway):

设备上的代码创建 - >发送到SMS-Gateway-Provider - >验证用户从SMS输入的代码

方式2(设备 - >服务器 - > SMS-Gateway - >设备< - >服务器):

从服务器请求代码创建 - >创建代码(保存在DB +发送加密代码作为响应)&将代码发送到SMS-GW - >发送短信到设备 - >检查用户输入的代码是否正确< - >服务器返回true / false。

现在有更好或更容易(更重要的安全和实用)方式吗?此外,我不知道如何加密/解密代码。它是一个只包含数字的6个字符的代码。

我的服务器后端是Java Jersey RESTful WS。

任何想法都表示赞赏。

1 个答案:

答案 0 :(得分:1)

SMS代码验证系统通常的工作方式是:

  1. 设备说服务器“给我发送代码”。
  2. 服务器生成代码并将其存储在数据库中(使用HMAC加密或散列)。
  3. 服务器将未加密的代码发送到SMS-Gateway(通过SSL)。
  4. 设备接收短信。
  5. 用户从SMS输入代码,设备将代码发送到服务器(通过SSL)。
  6. 服务器根据存储在数据库中的代码验证用户的代码。
  7. 服务器响应成功或失败。
  8. 您没有必要在设备上生成代码,或者将代码从服务器发送到设备。执行其中任何一项都会降低系统的安全性,因为设备在通过SMS接收代码之前会知道代码是什么。只要您使用SSL,就不需要在将代码从设备发送到服务器时加密代码(步骤5)。

    代码验证需要在服务器端完成,这样您才能成为唯一一个控制身份验证过程的人。如果您有移动应用程序做出身份验证决定,那么您可以通过改变应用程序或编写流氓应用程序的人来绕过身份验证过程。