【问题标题】:Android and PHP server: encrypt and decrypt dataAndroid 和 PHP 服务器:加密和解密数据
【发布时间】:2013-01-15 07:26:42
【问题描述】:

我有一个与我自己的服务器通信的 Android 应用程序。由于我们没有 https,我想实现自己的数据加密。服务器是用 PHP 实现的。

我想使用 AES,但我的主要问题是与本地应用程序共享服务器密钥,因为它可能被拦截,然后任何人都可以解密我的消息。

我应该改用 RSA 吗?还是有一种安全的方式来共享密钥?

谢谢!

【问题讨论】:

  • 我不认为你在这里是在帮自己一个忙;为什么 https 不是一个选项?
  • 其实我也不确定,是老板给的限制。我认为这与域名提供商有关。我会尝试找出为什么我们不能使用它。
  • 如果你真的不能使用https(在业务场景中......嗯......)那么当然非对称加密方法肯定是首选。另外,如果您找不到 strem 密码,则必须首先加密整个消息正文,这与 https 相比速度较慢,后者可以通过加密通道传输块。
  • 这取决于您将传输什么样的数据。如果要加密固定大小的数据块,即小于 RSA 密钥长度,则相对容易。如果你想加密比 RSA 密钥更大的可变长度,它会很慢,你必须以某种方式实现流式传输。在这种情况下,我建议改用 SSL 库。如果您的应用程序仅适用于 Android,请尝试使用 Java 接口到 HTTP,它已启用 https 支持。
  • SSL 使用 RSA 交换对称密钥,然后用对称密钥加密数据,速度快得多。但我建议问问你的老板有什么限制阻止了 HTTPS。

标签: php android encryption aes rsa


【解决方案1】:

您应该使用 RSA 和 AES 加密协议。

  • RSA 加密/解密短字符串(对 CPU 来说很繁重)。
  • AES 加密/解密大字符串(比 RSA 更快)。

所以:

  1. 客户端为每个请求创建一个随机的 AES 密钥(24 字节即可);
  2. 客户端使用AES密钥加密字符串请求(任意长度);
  3. 客户端使用 RSA PUBLIC 密钥加密 AES 密钥;
  4. 客户端将加密(AES 和字符串)发送到服务器(POST 很好);
  5. 服务器使用 RSA PRIVATE 密钥解密 AES 密钥;
  6. 服务器使用 AES 密钥解密字符串;
  7. 服务器处理字符串请求;
  8. 服务器使用相同的AES密钥加密响应字符串;
  9. 服务器响应返回给客户端;
  10. 客户端使用 AES 密钥解密响应。

在 GitHub 上查看以下开源项目:github.com/rcbarioni/followzup

服务器是用 PHP 实现的,并且有 PHP 和 Java 的 API。客户端和服务器之间的通信使用 AES 和 RSA。

PHP 和 Java 加密库完全兼容。 Java for Android 也兼容。

【讨论】:

【解决方案2】:

好吧,我会执行以下操作之一 - 优先级降低:

  • 告诉你的老板,HTTPS 是必经之路。
  • 使用像 openSSL 这样的 SSL 库
  • 使用 AES 发送消息,使用 RSA 交换会话的 AES 密钥

最后一个是最不受欢迎的,因为有很多事情,你可能会做错,从而意外破坏安全性。举个例子:如果你碰巧同时使用加密和压缩,你很容易受到CRIME attack...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-09
    • 1970-01-01
    • 2018-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-02
    • 2014-11-21
    相关资源
    最近更新 更多