0

我刚开始开发一个需要与服务器/数据库通信的 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”
  • 公开密钥文件的“openssl.exe rsa -in private.key -out public.pem -outform PEM -pubout”

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

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

我在网上搜索了与 PHP 端的 openssl_seal 结合使用的示例,但没有发现任何工作。

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

我还实现了此处提到的示例,但这不起作用(openssl_private_decrypt 在 PHP 端始终为 FALSE)。所以这对我没有帮助,而它只是 Android=>PHP 加密而没有相反的方式。

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

4

2 回答 2

0

如果您真的想手动进行加密,这也是可能的。

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

这个名为RSA encryption in Java的页面显示了执行此操作的示例。

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

于 2011-07-25T16:10:36.877 回答
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 密钥(在其证书中)来验证连接并协商对称加密的会话密钥。

于 2011-07-25T15:15:45.863 回答