使用openssl_seal&openssl_open(都是PHP)进行公钥私钥加密的Android对应物是什么?



我刚刚开始开发一个需要与服务器/数据库通信的android应用程序。在服务器端,我使用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上使用

生成了两个密钥文件
  • "openssl.exe genrsa -out private。私钥文件
  • 的密钥1024"
  • "openssl.exe rsa -in private. "Key out public。
  • 为publicKey文件提供pem -pubout

在PHP中,这一切都像预期的那样工作。

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

我在网上搜索了一些例子来结合使用openssl_seal在PHP方面,但没有找到任何工作。

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

我也实现了这里提到的例子,但没有工作(openssl_private_decrypt总是在PHP端为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的类)。安全性和子包),主要是Cipher

这个名为Java中的RSA加密的页面展示了一个这样做的例子。

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

最新更新