【问题标题】:Communication security in client-server based iPhone applications基于客户端-服务器的 iPhone 应用程序中的通信安全
【发布时间】:2012-04-21 00:39:46
【问题描述】:

我想保护我的 iPhone 客户端和服务器之间的通信。作为第一步,我希望我的服务器只响应授权的客户端。因此,即使有人入侵了通信通道,他也不应该能够创建一个请求来使他能够从服务器获得正确的响应。

我的问题是,从某种意义上说,如果我使用私钥在目标 C 中使用某些算法加密 iPhone 客户端上的某些安全数据,那么是否有任何哈希/加密解密算法在 JAVA 和目标 C 之间共享可以在我的基于 JAVA 的服务器上适当地解密,反之亦然。

任何合适的代码示例都会很有帮助。

【问题讨论】:

    标签: iphone objective-c ios cocoa-touch encryption


    【解决方案1】:

    在 iOS 中确保通信机密性的最简单(实际上也是最安全)的方法是使用 HTTPS 与您的后端通信。 NSURLConnection 直接支持这一点。开发自己的安全协议是众所周知的软件开发反模式(即,不应该采用的设计模式)。

    从您的问题中不清楚“授权客户端”是指应用程序(即只有“官方”客户端应用程序可以与后端对话)还是用户。后者肯定会得到更好的支持,通过 NSURLConnection 中的身份验证支持。基本上,用户提供他的用户名和密码,并且这个信息在每次请求时被发送到后端。用户的凭据可以缓存在 Keychain 中。

    可以通过 HTTP 客户端证书对客户端应用程序进行身份验证,但以安全方式实施可能会很棘手。

    【讨论】:

    • 我只使用 HTTPS,但要加倍确定我想在从服务器响应之前授权客户端调用。此外,HTTPS/SSL 也容易受到攻击。
    • 很多 系统在基本的 HTTP 身份验证以及 HTTPS 提供的数据(和凭据)的机密性方面都非常好。尽管所有系统都容易受到某些类型的攻击,但我认为您需要进行现实的威胁评估……您真的需要额外的保护吗?这些深奥威胁的可能性有多大?请记住,几乎可以保证您自己设计的任何安全协议都不如经过验证的真实方法安全。
    【解决方案2】:

    一种对客户端进行身份验证的低风险方法是使用共享密钥。客户端使用 MD5 或 SHA1 哈希对它的请求进行签名(两者的库都可以在 Java 或 Objective C 中拥有)。服务器以相同的方式对请求进行签名,然后将签名与客户端传递的签名进行比较,从而确认客户端的真实性。如果它们匹配,则服务器信任该请求。

    【讨论】:

    • 如果有人入侵 n/w 频道并发送相同的密钥怎么办?
    • 秘密不随消息一起发送,只是秘密生成的签名。服务器使用相同的(共享的)秘密对消息的明文部分进行签名。如果它可以生成相同的签名,则它信任发件人。这很容易受到黑客攻击,但更大的风险来自客户端的反编译,而不是传输中的任何内容。
    猜你喜欢
    • 2021-03-20
    • 1970-01-01
    • 1970-01-01
    • 2016-07-05
    • 2011-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多