首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用移动应用保护通信[真实性、隐私和完整性]?

使用移动应用保护通信[真实性、隐私和完整性]?
EN

Stack Overflow用户
提问于 2012-01-10 04:51:26
回答 3查看 7K关注 0票数 34

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

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

except :足够安全的敏感信息,如密码,除了暴力之外,不应该有直接的解密方式。

My requirements

  • 仅授权应用程序的身份验证
  • 之间不应修改完整性消息。
  • 如果嗅探到隐私通信,就不应该被读取

我的努力

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

问题

  • PGP需要在客户端应用程序上存储密钥。
  • 在客户端应用程序上,似乎没有确保密钥安全的方法。
  • 如果密钥被取出,则PGP或对称加密同样容易受到攻击。
  • 反向工程PGP键或对称键是同样困难的。
  • 在这种情况下,PGP是移动处理器的一个非意义的负担。
  • OAuth也是无用的,因为它还有一个客户端密钥.

那么,我如何才能/应该在这方面取得进展呢?这个行业如何处理这个问题?

我是否应该采用随意的方法:

  • 使用简单的SSL并将我的手指?,因为认证是不可能的,如果密钥被窃取?(只有服务器身份验证才有此功能)

更新:

结论是使用AES,因为如果我能保证密钥的安全,那么我就和SSL一样好。另外,为了更好的安全起见,我可以随时更换钥匙。如果你认为有更好的方法,请在发帖前阅读整个帖子。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-01-10 13:26:54

你在调查坏消息。SSL绝对可以对客户端进行身份验证,因为协议通常用于保护服务器身份验证很重要的电子商务站点,但与客户端的身份验证并不重要和/或不可行,因此对SSL的大部分内容不进行验证。您想要做的是使用相互认证的SSL,这样您的服务器将只接受来自您的应用程序的传入连接,而您的应用程序将只与您的服务器通信。

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

如果应用程序以外的其他人/东西试图连接到您的服务器,则不会创建SSL连接,因为服务器将拒绝传入的SSL连接,这些连接不显示您在应用程序中包含的客户端证书。

一步一步地解决这个问题是一个比这里更长的答案。我建议分阶段这样做,因为网络上有关于如何处理服务器端和客户端的Android和iOS中的自签名SSL证书的资源。在我的书“Android平台的应用程序安全性”中也有一个完整的介绍,这本书由O‘’Reilly出版。

票数 23
EN

Stack Overflow用户

发布于 2014-01-17 03:09:32

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

移动应用程序不能保存任何秘密,这是一个事实。所以永远不要在设备上放置证书/密码。典型的坏示例是在某些系统密钥库(如IOS密钥链)中保存用户名和密码。如果应用程序用户没有在手机上设置密码,整个密钥存储库将以纯文本形式保存,任何人都可以转储所有信息。与服务器不同,在应用程序中嵌入证书几乎与服务器不同,手机没有锁在机房里。人们确实会失去他们。

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

OAuth2.0隐式流就是为了解决这个问题而设计的。然而,这远非完美。OAuth2.0规范也存在一些基本问题。特别是要实现这一流程,需要应用程序使用UIWebView (嵌入式浏览器),这本身就可能是不安全和不良的用户体验。因此,这基本上消除了所有基于重定向的流。唯一一个使用OAuth 2重定向流的著名应用是facebook,它做得很糟糕。

OAuth 2.0资源所有者流是一种选择。有了这个流程,您的整个系统安全级别就可以和B2C解决方案一样高--基于浏览器的在线银行解决方案就是一个例子。这意味着任何具有用户名密码的人都可以访问服务器上的资源--基于浏览器的解决方案的安全级别相同。

但是,您仍然需要小心,正如前面提到的,OAuth 2规范有一些基本问题--在这种情况下,您不能按照它的规范来实现令牌刷新逻辑--这通常涉及使用永不过期的刷新令牌--这可以被看作是谷歌的OAuth 2实现。这个令牌本身就成了秘密

解决方法之一是基于最后一个活动自动更新令牌。

无论如何,移动应用程序安全根本不是一个新的话题,但遗憾的是,我们仍然没有任何标准的工具/机制来解决这些独特的挑战。

这就是为什么银行支付数百万来做他们的移动银行解决方案,但他们仍然失败(http://hothardware.com/News/Mobile-Banking-Apps-for-iOS-Vulnerable-to-Man-in-the-Middle-Attacks/) ;-)

票数 5
EN

Stack Overflow用户

发布于 2012-01-10 06:19:27

将客户端身份验证与SSL一起使用,或者只在服务器身份验证SSL之上使用您自己的客户端身份验证(用户名/密码、令牌等)。

(编辑:将评论移到这里,因为它不适合作为评论)

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

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8798707

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档