2011-07-25 50 views
0

我剛開始開發一個需要與服務器/數據庫通信的android-app。在服務器端,我使用PHP來收集數據或執行查詢。我讀了很多關於安全性(XSS,SQL注入等)的內容。因爲我也想加密在客戶端&服務器之間發送的數據,我開始在PHP中處理openssl函數。與openssl_seal&openssl_open(都是PHP)公有私鑰加密的Android對應方是什麼?

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產生並用於解密的隨機密鑰。

兩個密鑰文件HABE被生產在Windows上使用

  • 「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側進行解密(藉助第二公共/專用密鑰對我假定)

我還實施本例中提到here但沒有工作(在PHP方面openssl_private_decrypt總是FALSE)。所以這並沒有幫助我,而只有Android => PHP加密沒有其他方式。

總而言之:我正在尋找一種方法來加密和解密在Android和PHP之間發送的數據,每一邊只有接收者可以解密數據。有人能給我一個例子,甚至是線索嗎?

+0

btw:我想到public-privatekey加密**,因爲**我不想在我的應用中存儲密鑰(用於解密),以便只有消息的接收者才能解密消息。 – MojitoJoe

回答

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密鑰(在其證書中)對連接進行身份驗證併爲對稱加密協商會話密鑰。

+0

謝謝Paŭlo。我讀過幾次,這通常是通過證書認證來完成的。但也因爲我的託管軟件包不允許創建證書我想知道一種方式來加密/解密數據與Android和PHP之間的公鑰/私鑰...如果我只是想傳輸加密的密碼從我的小型初學者應用程序到我的web服務(反之亦然),我無法相信租用服務器和建立ssl連接是唯一的方法,是嗎? – MojitoJoe

0

如果你真的想手動進行加密,這也是可能的。

javax.crypto包中包含此處需要的必要類(以及一些來自java.security和子包),主要是Cipher類。

此頁面名RSA encryption in Java顯示了這樣做的一個例子。

可以使用Java的KeyStore機制(並在您的jar中包含密鑰庫或在Android上使用任何格式)來代替以序列化格式從文件加載公鑰。

+0

再次感謝。我昨天玩過(正如問題中提到的那樣(請參閱鏈接),並使用了與您的示例頁面中類似的功能。它以某種方式加密了我的數據,但我沒有在PHP端解密它...即使提到了在PHP中有很多openssl函數,每個函數都有幾十個參數 - 我不知道自己弄清楚了所有這些...... arrrg。 – MojitoJoe

+0

此外,它不使用這個特殊的extra-安全生成一個隨機的加密密鑰,就像「openssl_seal」正在做的那樣,所以這並不是我的問題的答案,但是我希望能夠正確地工作,目前我沒有任何關於兩個世界的工作例子。 – MojitoJoe