我刚刚开始开发一个需要与服务器/数据库通信的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上生成的在PHP中,这一切都按预期工作。
但是如何在Android中实现相同的技术(我是初学者!)?
我在网上搜索了一些示例,以便在PHP端与openssl_seal一起使用,但没有找到任何有效的工作。
我还实现了提到的here示例,但是没有用(openssl_private_decrypt在PHP端总是为FALSE)。所以这并没有帮助我,而只有Android => PHP加密而没有反过来。
总而言之:我正在寻找一种方法来加密和解密Android和PHP之间发送的数据,只有接收者可以解密数据。有人可以给我一个例子甚至线索吗?
答案 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上使用的任何格式),而不是以序列化格式从文件加载公钥。