【问题标题】:Securing mobile client to server communication保护移动客户端到服务器的通信
【发布时间】:2014-05-29 15:09:10
【问题描述】:

我正在构建一个与服务器通信的移动应用。我希望通信尽可能安全,但我没有这方面的经验。

应用首次启动时,应用向服务器提交电话号码,通过 SMS 获取 6 位代码,然后将这 6 位代码提交到服务器。假设 6 位代码是有效的,服务器将返回移动应用程序一个 API 密钥(长唯一字符串)以保存在移动应用程序上。我正在这样做,因此当用户在另一台设备上重新安装应用程序时,服务器将撤销对旧移动设备的访问权限(即:API 密钥将不再有效)。

我从这里去哪里?我的意图是使用 API 机密来保护从移动应用程序到服务器的所有未来通信(即:注册后的所有通信)。我从之前使用过的不同 API 中获得了这个想法,在这些 API 中,我看到每个 API 用户都被赋予了一个 API 密钥/秘密。在这些 API 上,我注意到 API 机密以下列方式使用,但我不知道这是否是我需要的。

params = {"method":  api_function_name,
          "order":  'DESC'
          "key":    CLIENT_SPECIFIC_API_KEY,
         }

params = urllib.urlencode(params) 

H = hmac.new(CLIENT_SPECIFIC_API_SECRET, digestmod=hashlib.sha512)
H.update(params)
sign = H.hexdigest()

谁能帮我弄清楚我需要从这里做什么?

【问题讨论】:

    标签: android security mobile https client-server


    【解决方案1】:

    我需要从这里做什么

    为了获得良好的安全性,您应该做的第一件事就是弄清楚通信应该针对谁或什么进行安全。

    为此特定应用要做的一件事是为服务器设计一种方法,以确定在“重新安装”情况下哪个设备应该替换哪个设备。

    问题中的代码看起来像是通过客户端和服务器之间的机密通道对客户端进行身份验证的一种不错的方式。客户端向服务器发送(params, sign),对吧?

    【讨论】:

    • 是的,客户端发送参数,由 CLIENT_SPECIFIC_API_SECRET 秘密签名,用于注册过程之后的任何通信。 CLIENT_SPECIFIC_API_SECRET 在成功注册后本地保存到移动设备。是否有任何与此类似的指南或通用通信模式可供我查看?试图用谷歌搜索类似的东西,但似乎每个人都实现了自己的专有解决方案。
    【解决方案2】:

    从您的第一篇文章中,我可以看到您正在计算 CLIENT_SPECIFIC_API_SECRET 的哈希值。我认为这是为了让您可以存储散列形式而不是原始 CLIENT_SPECIFIC_API_SECRET?这通常在服务器端完成,以防止在黑客入侵的情况下暴露密码。这对于服务提供商来说尤其重要,因为一次黑客攻击可能导致大量客户端密码泄露。

    就使用 CLIENT_SPECIFIC_API_SECRET 对客户端实例进行身份验证而言,肯定存在现有技术。一个很好的基本示例是HTTP Authentication RFC 2617 中指定的摘要式身份验证机制 - 具体请参阅摘要式身份验证部分。请注意,此 RFC 显示了 HTTP 的摘要式身份验证,但基本原则可以在 HTTP 之外应用。例如,在 IMS SIP 中也使用了 Digest Authentication。

    要对设备进行身份验证,您可以在每次设备打开与服务器的连接时执行摘要式身份验证步骤。当然连接也应该加密(带有 SSL 的 TCP),以防止中间人攻击。

    【讨论】:

      猜你喜欢
      • 2017-04-11
      • 1970-01-01
      • 2012-05-06
      • 1970-01-01
      • 1970-01-01
      • 2018-04-12
      • 1970-01-01
      • 1970-01-01
      • 2016-05-16
      相关资源
      最近更新 更多