繁体   English   中英

使用openssl_seal和openssl_open(两个PHP)进行public-private-key-encryption的Android对应部分是什么?

[英]What is the Android-counterpart of public-private-key-encryption with openssl_seal & openssl_open (both PHP)?

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

openssl_seal-和openssl_open-functions似乎很好地用于此目的。 我写了这两个函数:

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”
  • “ publics”文件的“ openssl.exe rsa -in private.key -out public.pem -outform PEM -pubout”

在PHP中,这一切都可以按预期进行。

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

我在网上搜索了与PHP上的openssl_seal结合使用的示例,但未找到任何有效的方法。

  1. 我希望能够在Android端加密数据并在PHP上解密数据。
  2. 当服务器发送加密数据时,应在Android端解密(我假设使用第二对public / privateKey对)

我还实现了此处提到的示例但是没有用(在PHP方面,openssl_private_decrypt始终为FALSE)。 因此,这对我没有帮助,而只有Android => PHP加密而没有其他方法。

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

这样做的通常方法不是(直接)非对称加密,而是使用加密(和经过身份验证)的通道发送数据,例如使用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密钥(在其证书中)来认证连接并协商用于对称加密的会话密钥。

如果您确实想手动进行加密,那么也可以这样做。

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

Java中名为RSA加密的页面显示了执行此操作的示例。

您可以使用Java的KeyStore机制(并在您的jar中包含密钥库或Android上使用的任何格式)来代替从序列化格式的文件中加载公钥。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM