0

サーバー/データベースと通信する必要があるAndroidアプリの開発を始めました。サーバー側では、PHP を使用してデータを収集したり、クエリを実行したりします。セキュリティ (XSS、SQL インジェクションなど) についてよく読んでいます。クライアントとサーバーの間で送信されるデータも暗号化したいので、PHP で openssl 関数を扱い始めました。

openssl_seal- および openssl_open-functions は、この目的に適しているようです。私はこれらの2つの関数を書きました:

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 によって生成され、復号化に使用されるランダムキーです。

2 つのキーファイルは、Windows で以下を使用して作成されています。

  • privateKey ファイルの「openssl.exe genrsa -out private.key 1024」
  • publicKey ファイルの「openssl.exe rsa -in private.key -out public.pem -outform PEM -pubout」

PHP内では、これはすべて期待どおりに機能します。

しかし、Android で同じ手法を実装するにはどうすればよいでしょうか (私は初心者です!)?

PHP側でopenssl_sealと組み合わせて使用​​する例をWebで検索しましたが、何も機能していませんでした。

  1. Android 側でデータを暗号化し、PHP で復号化できるようにしたいと考えています。
  2. そして、サーバーが暗号化されたデータを送信している場合、これは Android 側で復号化されます (2 つ目の public/privateKey ペアを使用すると仮定します)。

ここに記載されている例も実装しましたが、うまくいきませんでした (openssl_private_decrypt は PHP 側では常に FALSE でした)。だから、それは私を助けませんでしたが、それはAndroid => PHP暗号化だけであり、その逆はありませんでした。

要約すると、受信者のみがデータを復号化できる両側で、Android と PHP の間で送信されるデータを暗号化および復号化する方法を探しています。誰かが私に例や手がかりを与えることができますか?

4

2 に答える 2

0

これを行う通常の方法は、(直接) 非対称暗号化ではなく、SSL/TLS などを使用して、暗号化された (および認証された) チャネルを使用してデータを送信します。

サーバー側では、HTTPS アクセスも提供するように Web サーバーを構成するだけです。

クライアント側では、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 に答える
0

本当に手動で暗号化を行いたい場合は、これも可能です。

javax.cryptoパッケージには、ここで必要なクラス ( java.securityおよびサブパッケージからのいくつかと一緒に) が含まれており、主にCipherクラスです。

Java での RSA 暗号化という名前のこのページは、これを行う例を示しています。

シリアル化された形式でファイルから公開鍵をロードする代わりに、Java の KeyStore メカニズムを使用できます (そして、jar または Android で使用されている形式にキーストアを含めます)。

于 2011-07-25T16:10:36.877 に答える