Android 使用移动应用程序确保通信[真实性、隐私和完整性]?

Android 使用移动应用程序确保通信[真实性、隐私和完整性]?,android,iphone,python,django,security,Android,Iphone,Python,Django,Security,Android/Iphone应用程序将从服务器访问应用程序数据。 [Django Python] 如何确保与移动应用程序的通信安全 期望值:对密码等敏感信息足够安全,除暴力破解外,不得直接解密 我的要求: 身份验证[仅授权应用程序] 完整性[消息之间不应修改] 隐私[如果嗅探到,通信不应可读] 我的努力: SSL只对服务器进行身份验证,而不对客户端进行身份验证 我不能使用对称加密[仅提供隐私] 数字签名不可能[缺乏隐私] PGP完全满足所有3项要求 问题: PGP需要在客户端应用程序上

Android/Iphone应用程序将从服务器访问应用程序数据。 [Django Python]

如何确保与移动应用程序的通信安全

期望值:对密码等敏感信息足够安全,除暴力破解外,不得直接解密

我的要求

  • 身份验证[仅授权应用程序]
  • 完整性[消息之间不应修改]
  • 隐私[如果嗅探到,通信不应可读]
我的努力

  • SSL只对服务器进行身份验证,而不对客户端进行身份验证
  • 我不能使用对称加密[仅提供隐私]
  • 数字签名不可能[缺乏隐私]
  • PGP完全满足所有3项要求
问题

  • PGP需要在客户端应用程序上存储密钥
  • 在客户端应用程序上,似乎没有确保密钥安全的方法
  • 如果密钥已过期,则PGP或对称加密同样易受攻击。
  • 反向工程PGP键或对称键同样困难
  • 在这种情况下,PGP对移动处理器来说是一种无意义的负担。
  • OAuth同样无用,因为它还有一个客户机密钥。
那么,我如何才能/应该在这方面取得进展? 行业如何应对这一问题?

我是否应该实施休闲方式:

  • 使用简单的SSL并祈祷?,因为如果密钥被盗,则无法进行身份验证?(只有服务器身份验证才能使用此选项)
更新:

结论是使用AES,因为如果我能保证密钥的安全,那么我就和SSL一样好。 另外,我可以随着时间的推移不断更换钥匙,以提高安全性。
如果您认为有更好的方法,请在发布之前阅读全文。

使用SSL进行客户端身份验证,或者在服务器身份验证SSL的基础上添加您自己的客户端身份验证(用户名/密码、令牌等)

(编辑:将注释移动到此处,因为它不适合作为注释)


更详细地说,任何身份验证信息都需要存储或输入到应用程序中。如果每次都有人输入密码,则无需保存,但这显然很不方便。您可以使用特定于设备的密钥对其进行加密,因此它在根设备上不可见。对于私钥,您需要使用用户输入的密码(见上文)对其进行保护,或者由系统对其进行保护。这只在Android 4.0(ICS)之后才可用,该系统的密钥库是
KeyChain
类的公共API。在这种情况下,用户需要解锁(使用模式/密码或PIN)手机才能访问密钥库。

您正在处理错误信息。SSL绝对可以对客户端进行身份验证,但这不是针对大部分SSL所做的事情,因为协议通常(或至少曾经)用于保护电子商务站点,其中服务器身份验证很重要,但对客户端进行身份验证并不重要和/或不可行。您要做的是使用相互验证的SSL,这样您的服务器将只接受来自您的应用程序的传入连接,并且您的应用程序将只与您的服务器通信

这是高层次的方法。创建自签名服务器SSL证书并部署到web服务器上。如果您使用的是Android,您可以使用Android SDK附带的keytool来实现此目的;如果你使用的是另一个应用程序平台,比如iOS,也有类似的工具。然后创建一个自签名客户机,并将其部署到应用程序中的自定义密钥库中,该密钥库作为资源包含在应用程序中(keytool也将生成该资源)。将服务器配置为要求客户端SSL身份验证,并仅接受您生成的客户端证书。将客户端配置为使用该客户端证书来标识其自身,并仅接受服务器上为该部分安装的一个服务器端证书

如果应用程序以外的其他人/事物尝试连接到您的服务器,则不会创建SSL连接,因为服务器将拒绝不提供应用程序中包含的客户端证书的传入SSL连接


一步一步地解决这个问题是一个比这里所保证的要长得多的答案。我建议分阶段进行,因为网上有关于如何在Android和iOS(服务器端和客户端)中处理自签名SSL证书的资源。在我的书(由O'Reilly出版)中也有一个完整的介绍。

SSL确实有双向身份验证,其他评论者已经提到了这一点。 但是,我认为你甚至不应该尝试验证客户端,也就是应用程序。您只验证用户(Oauth术语中的资源所有者),而不是代理或客户端

事实上,移动应用程序不能隐藏任何秘密。因此,切勿在设备上放置证书/密码。典型的坏例子是将用户名和密码保存在某些系统密钥库中,例如IOS密钥链。如果应用程序用户未在手机上设置密码,则整个密钥库将以纯文本形式保存,任何人都可以转储所有信息。在应用程序中嵌入证书几乎和服务器一样糟糕,因为手机没有被锁在电脑房里。人们确实会失去它们

在此基础上,您需要一个基于令牌的解决方案,这样应用程序就不需要持有机密。您可以传递机密(用户登录凭据),并立即将其从内存中清除。您只需持有代币,该代币将是短期的(30分钟后到期等)

OAuth2.0隐式流就是为了解决这个问题而设计的。然而,这还远远不够完美。OAuth2.0规范有一些基本问题,特别是