簡體   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