我可以仅使用OpenSSL来加密URL参数吗?

时间:2011-05-10 10:53:06

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

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

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

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

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

感谢您的任何见解。

3 个答案:

答案 0 :(得分:2)

这是可能的。

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

  1. 生成公钥 - 私钥对。
  2. 将私钥安全地存储在服务器上。保护好。
  3. 将公钥分发到iPhone应用程序。
  4. iPhone应用程序使用公钥加密数据。
  5. iPhone应用程序将加密数据发送到服务器。
  6. 服务器使用私钥解密加密数据。
  7. 您可以使用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库来实现它。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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