[英]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上通過使用以下命令生成的
在PHP中,這一切都可以按預期進行。
但是如何在Android中實現相同的技術(我是一個初學者!)?
我在網上搜索了與PHP上的openssl_seal結合使用的示例,但未找到任何有效的方法。
我還實現了此處提到的示例,但是沒有用(在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的KeyStore機制(並在您的jar中包含密鑰庫或Android上使用的任何格式)來代替從序列化格式的文件中加載公鑰。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.