1

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

要求是,手机上的应用程序能够与服务器通信,而无需用户输入任何凭据。我的目标是防止通过欺骗检查URL中的参数和滥用我们的系统。因此,为了进行加密,我们应用程序的所有副本都可以看起来像是同一个用户。我没有计划使用HTTPS,因为(如果我没有弄错)它需要会话或证书,它似乎过度(但让我知道如果不是);我只需要加密和解密URL的参数部分。

由于要用RSA公钥加密的数据必须小于密钥,因此标准过程是生成一个对称私钥,使用公钥对其进行加密,然后使用生成的私钥对数据进行加密,然后将生成的私钥和加密数据发送给服务器。它看起来像我需要加密生成的密钥的大部分内容(除了进程中的RSA_size()崩溃)。但我不知道如何使用Blowfish或PHP支持的其他算法来指定和设置批量数据的编码。

感谢您的任何见解。

+1

你无法使用HTTPS安全地发布数据的任何原因? – BoffinbraiN 2011-05-10 11:10:58

+0

也许不是;我不知道涉及到什么。要求是电话上的应用程序能够与服务器进行通信,而无需用户输入任何凭证。我的目标是防止通过欺骗检查URL中的参数和滥用我们的系统。因此,为了进行加密,我们应用程序的所有副本都可以看起来像是同一个用户。我会在上面的描述中添加这个。感谢您的回复。 – Oscar 2011-05-10 19:17:38

回答

2

这是可能的。

您可以使用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库来实现它。

+0

非常感谢;这正是我所寻找的(尽管我不知道它是否比我的目的HTTPS好)。我会给它一个镜头。 – Oscar 2011-05-10 19:25:06

+0

如果你不知道它是否更好,那么它不是。 – Hoylen 2011-05-10 21:17:51

+0

我有为手机编译的OpenSSL加密库。现在我需要使用C代码而不是命令行语法在手机上执行加密步骤。数据和公钥将来自内存中的结构而不是文件。 – Oscar 2011-05-14 22:25:07

1

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

+0

Javascript将不会用于iPhone应用程序(没有一些费力的解决方法),并且您链接到的项目受到阻止我使用GnuPG的相同许可证的阻碍。 – Oscar 2011-05-10 19:07:02

+0

好的,谢谢。 – 2011-05-11 06:26:50

0

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

+0

谢谢,但没有任何会话。这些是独立查询命中服务器并返回数据;为我的应用程序维护会话并不实际(或必须)。 – Oscar 2011-05-10 18:58:41

+0

啊,是的,那么我的想法根本不起作用。 – spowers 2011-05-13 15:57:45

相关问题