openssl_seal& amp; amp; public-private-key-encryption的Android对应物是什么? openssl_open(都是PHP)?

时间:2011-07-25 13:13:07

标签: php android encryption public-key private-key

我刚刚开始开发一个需要与服务器/数据库通信的android-app。在服务器端,我使用PHP来收集数据或执行查询。我读了很多关于安全性(XSS,SQL注入等)的内容。因为我也想加密客户端和客户端之间发送的数据。服务器我开始用PHP处理openssl-functions。

openssl_seal-和openssl_open-函数似乎对此有用。 我写了这两个函数:

function encryptRnd($data) {
$pubKey = file_get_contents("public.key");
$publicKeys = array(openssl_pkey_get_public($pubKey));
$res = openssl_seal($data, $encryptedData, $encryptedKeys, $publicKeys);
return array("data" => base64_encode($encryptedData), "rndKey" => base64_encode($encryptedKeys[0]));}

function decryptRnd($credentials) {
$privateKey = openssl_get_privatekey(file_get_contents("private.key"));
$result = openssl_open(base64_decode($credentials["data"]), $decryptedData, base64_decode($credentials["rndKey"]), $privateKey);
if (!$result) echo "ERROR during decryption.\n";
return $decryptedData;}

“a”是数据(加密/加密),而“b”是openssl_seal生成的随机密钥,用于解密。

这两个密钥文件是使用

在Windows上生成的
  • “privateKey文件的openssl.exe genrsa -out private.key 1024”
  • “openssl.exe rsa -in private.key -out public.pem -outform PEM -pubout”for publicKey file

在PHP中,这一切都按预期工作。

但是如何在Android中实现相同的技术(我是初学者!)?

我在网上搜索了一些示例,以便在PHP端与openssl_seal一起使用,但没有找到任何有效的工作。

  1. 我希望能够在Android端加密数据并解密 它在PHP上。
  2. 当服务器发送加密数据时,这应该在Android端解密(我假设有第二个public / privateKey对)
  3. 我还实现了提到的here示例,但是没有用(openssl_private_decrypt在PHP端总是为FALSE)。所以这并没有帮助我,而只有Android => PHP加密而没有反过来。

    总而言之:我正在寻找一种方法来加密和解密Android和PHP之间发送的数据,只有接收者可以解密数据。有人可以给我一个例子甚至线索吗?

2 个答案:

答案 0 :(得分:0)

执行此操作的常用方法不是(直接)非对称加密,而是使用加密(和经过身份验证的)通道发送数据,例如使用SSL / TLS。

在服务器端,您只需将Web服务器配置为也提供HTTPS访问。

在客户端,我认为最简单的方法是使用HTTPS URL发送数据:

URL url = new URL("https://example.com/myscript.php");
URLConnection conn = url.openConnection();
conn.setDoOutput(true);
OutputStream out = conn.getOutputStream();

 // write data to stream

out.close();
InputStream in = conn.getInputStream();

// read answer from input stream

in.close();

但我不确定如何为Android配置接受的服务器证书。

这将(在引擎盖下)使用服务器的RSA密钥(在其证书中)来验证连接并协商会话密钥以进行对称加密。

答案 1 :(得分:0)

如果您真的想手动进行加密,也可以这样做。

javax.crypto包中包含此处所需的必要类(以及java.security和子包中的一些),主要是Cipher类。

这个名为RSA encryption in Java的页面显示了这样做的一个例子。

您可以使用Java的KeyStore机制(包括jar中的密钥库或Android上使用的任何格式),而不是以序列化格式从文件加载公钥。