Android/Iphone应用程序将从服务器访问应用程序数据.

如何使用移动应用程序保护通信安全?

Expectation:对密码等敏感信息足够安全,除暴力破解外,不应有直接解密方式.

My requirements:

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

My effort:

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

Problem :

  • PGP要求在客户端应用程序上存储密钥.
  • 在客户端应用程序上似乎没有确保密钥安全的方法.
  • If the key is out, then PGP or Symmetric encryption are equally vulnerable.
  • 反向工程PGP密钥或对称密钥同样困难.
  • In that case PGP is a non-sense burden on the mobile processor.
  • OAuth is again useless, since it also have a client key.

那么,我应该如何推进这一点呢? How does the industry deals with this ?

我是否应该实施非正式的方法:

  • Use simple SSL and cross my fingers ?,因为如果密钥被盗,身份验证是不可能的?(使用此选项只能进行服务器身份验证)

Update:

结论是使用AES,因为如果我能保证密钥的安全,那么我就和SSL一样好.

推荐答案

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

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

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

对于这一点的循序渐进的回答比这里保证的要长得多.我建议分阶段做这件事,因为网上有关于如何在Android和iOS中处理自签名SSL证书的资源,无论是服务器端还是客户端.在我由O‘Reilly出版的书"Application Security for the Android Platform"中也有一个完整的演练.

Django相关问答推荐

仅更新模型中的特定字段.Model Django

Django后端对印前判断请求未通过访问控制判断给我以下回应:否访问控制允许来源

Django和静态文件

无法在 docker 启动Django项目

APIView查询未返回任何结果

如何在Django中显示多个相关对象

django-filter compose 过滤的 url

按下按钮刷新在html文件中显示的变量

为什么 Django 在错误的目录中寻找模板?

lower() 在 None 上被调用

Django - 使用在 URL 中传递的父类主键从子类中过滤对象

Django 有脚手架吗?

带有代码完成功能的 python / django 的 Sublime Text 2 和 3 设置

Django 模板中的 Handlebars.js

直接在Django的模板中访问ForeignKey

如何在 twitter-bootstrap 模式窗口中插入 django 表单?

如何在该元素中的所有应用程序之间共享元素范围的模板标签

显式 cursor.close() 的必要性

在 Django REST 框架序列化程序中动态排除或包含字段

Django:按位置排序,忽略 NULL