【问题标题】:Can I use OpenSSL just to encrypt URL parameters?我可以使用 OpenSSL 来加密 URL 参数吗?
【发布时间】:2011-05-10 10:53:06
【问题描述】:

我只需要一个公钥加密方案,我可以使用它来加密由 iPhone 应用程序发送到服务器上的 PHP 的参数。我不能使用 GnuPG 因为它的许可证。

要求是手机上的应用程序能够与服务器进行通信,而无需用户输入任何凭据。我的目标是防止检查 URL 中的参数和通过欺骗来滥用我们的系统。因此,出于加密目的,我们应用程序的所有副本都可以看起来像同一个用户。

我还没有计划使用 HTTPS,因为(如果我没记错的话)它需要会话或证书,而且似乎过多(但如果没有,请告诉我);我只需要加密和解密 URL 的参数部分。

由于要使用 RSA 公钥加密的数据必须比密钥短,标准过程是生成对称私钥,用公钥加密,用生成的私钥加密数据,然后发送生成的私钥和加密的数据到服务器。看起来我拥有加密生成的密钥所需的大部分内容(过程中的 RSA_size() 崩溃除外)。但我不知道如何使用 Blowfish 或 PHP 支持的其他算法指定和设置批量数据的编码。

感谢您的任何见解。

【问题讨论】:

  • 您为什么不能使用 HTTPS 安全地 POST 数据?
  • 也许不是;我不知道有什么关系。要求是手机上的应用程序能够与服务器进行通信,而无需用户输入任何凭据。我的目标是防止检查 URL 中的参数和通过欺骗来滥用我们的系统。因此,出于加密目的,我们应用程序的所有副本都可以看起来像同一个用户。我将把它添加到我上面的描述中。感谢您的回复。

标签: iphone encryption openssl public-key-encryption url-parameters


【解决方案1】:

这是可能的。

您可以只使用 RSA 公钥加密算法,而无需 PGP 或 X.509v3 围绕它们的任何开销和基础设施。

  1. 生成公私密钥对。
  2. 将私钥安全地存储在服务器上。好好保护它。
  3. 将公钥分发给 iPhone 应用程序。
  4. iPhone 应用程序使用公钥加密数据。
  5. iPhone 应用程序将加密数据发送到服务器。
  6. 服务器使用私钥解密加密数据。

您可以使用openssl 命令行工具来尝试这个想法:

在服务器上运行:

$ openssl genrsa -out myprivatekey.pem 2048
$ openssl rsa -in myprivatekey.pem -pubout -out mypublickey.pem

将 mypublickey.pem 复制到客户端,并在客户端在 data.dat 中创建一些数据并运行:

$ openssl rsautl -encrypt -pubin -inkey mypublickey.pem -in data.dat -out enc.dat

将enc.dat发送到服务器,然后在服务器上运行:

$ openssl rsautl -decrypt -inkey myprivatekey.pem -in enc.data -out data2.dat

公钥不必受到保护,因此您可以以任何您想要的方式将其分发到 iPhone 应用程序。例如,将其嵌入到应用程序中,将其放在公共 Web 服务器上,通过不安全的电子邮件将其发送给客户端。坏人得手也没问题。

注意:在示例中,我创建了一个 2048 位 RSA 密钥。请记住,对于非对称算法(即公钥算法),您需要更长的位长度密钥才能实现与用于对称算法的密钥相同的安全级别。不要以为 128 位 AES 加密非常强大,所以我将创建一个 128 位 RSA 密钥——这对于 RSA 密钥来说太短了,并且不会给你所期望的安全强度。

现在您只需要通过在代码中调用 openSSL 库来实现它。

【讨论】:

  • 非常感谢;这正是我想要的(虽然我不知道它是否比 HTTPS 更好)。我会试一试。
  • 如果你不知道它是否更好,那么它不是。
  • 我为手机编译了 OpenSSL 加密库。现在我需要使用 C 代码而不是命令行语法在手机上执行加密步骤。数据和公钥将来自内存结构而不是文件。
【解决方案2】:

我想,我也不是很确定——如果你需要加密发送的数据并且你没有通过 HTTPS 连接,那么你可以尝试实现一些 JS 加密模块。 (我找到了http://www.hanewin.net/encrypt/)您可以根据用户名或客户端电脑的名称生成密钥。

【讨论】:

  • Javascript 不能用于 iPhone 应用程序(没有一些费力的解决方法),并且您链接到的项目受到阻止我使用 GnuPG 的相同许可证的限制。
【解决方案3】:

另一种可能性是不使用公钥/私钥加密,而是使用对称密钥加密。您可能想要做的是每个会话让客户端应用程序生成一个密钥,使用单个 HTTPS 连接来发送服务器可以用来解密参数的密钥。现在,您所有的常规连接都可以使用只有客户端和服务器知道的密钥来使用加密参数。每个设备应该是唯一的,并且可能是会话。您可能希望将时间戳与它关联起来,以便知道在它处于非活动状态多长时间后,它可以被丢弃,或者被视为来自无效会话。

【讨论】:

  • 谢谢,但没有任何会话。这些是访问服务器并返回数据的独立查询;为我的应用程序维护会话是不切实际的(或必要的)。
猜你喜欢
  • 2015-11-19
  • 1970-01-01
  • 2012-03-03
  • 2015-10-08
  • 1970-01-01
  • 2016-06-18
  • 1970-01-01
  • 2013-01-12
  • 2023-03-04
相关资源
最近更新 更多