2011-07-25 5 views
0

私は、サーバー/データベースと通信するために必要なアンドロイドアプリの開発を始めました。サーバー側では、PHPを使用してデータを収集したり、クエリを実行したりします。私はセキュリティ(XSS、SQLインジェクションなど)について多くのことを読んでいます。私はまた、クライアント&サーバー間で送信されるデータを暗号化したいと思いますので、私はPHPでのopenssl-機能を扱うようになりました。openssl_seal&openssl_open(両方ともPHP)で公開秘密鍵暗号のアンドロイド対応とは何ですか?

openssl_seal-とopenssl_open-機能は、この目的のために良いように思われます。 (暗号化する/暗号化された)「B」はランダムキーopenssl_sealによって生成され、復号化のために使用される

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;} 

「が」データである: 私はこの2つの機能を書きました。

2キーファイルhabeのPrivateKeyファイルの

  • "openssl.exe genrsa -out private.key 1024" を使用してWindows上で生産されて
  • 「openssl.exe RSA -in private.key - パブリックキーファイルの場合はpublic.pem -outform PEM -puboutを入力してください。

PHP内では、これはすべて期待通りに動作します。

しかし、どのようにアンドロイドに同じ技術を実装する(と私は初心者ですか!)?

私は例がPHP側でopenssl_sealと組み合わせて使用​​するためのWebを検索するが、作業は何も見つかりませんでした。

  1. 私はAndroid側でデータを暗号化し、 をPHPで復号化したいと考えています。
  2. 、サーバが暗号化されたデータを送信しているとき、これは(私が想定する第二のPrivateKey /公共のペアで)のAndroid側で復号化されなければならない

私も(hereを述べたが、それが機能しなかった例を実装PHP側ではopenssl_private_decryptは常にFALSEでした)。だからそれは私には役立ちませんでしたが、Android => PHPの暗号化には他の方法はありませんでした。

合計:私はAndroidとPHPの間で送信されたデータを暗号化して復号化する方法を探しています。受信側だけがデータを復号化できるようになっています。誰かが私に例や手がかりを与えることができますか?

+0

btw:私はpublic-privatekey-encryption **を考えました。**私は、メッセージの受信者だけがメッセージを解読できるように、私のアプリに鍵(解読用)を保存したくないからです。 – MojitoJoe

答えて

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キー(証明書内)を使用して接続を認証し、対称暗号化用のセッションキーをネゴシエートします。

+0

ありがとうPaŭlo。私はこれが通常証明書認証によって行われることを数回読んだ。しかし、私のホスティングパッケージは証明書を作成することを許可していないので、私はAndroidとPHPの間の公開鍵/秘密鍵でデータを暗号化/復号化する方法を知りたいと思っています...ただ暗号化されたパスワード私の小さな初心者アプリから私のWebサービス(またはその逆)から、私はサーバーを借りてSSL接続を構築することは唯一の方法だとは思いませんか? – MojitoJoe

0

実際に暗号化を手動で行う場合は、これも可能です。

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

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

公開鍵をファイルからシリアライズされた形式で読み込むのではなく、JavaのKeyStoreメカニズムを使用することができます(あなたのjarファイルにキーストアを含めたり、

+0

もう一度ありがとうございます。私は昨日(質問に記載されているように(リンクを参照)、あなたのサンプルページと同様の機能を使用していましたが、データを何とか暗号化しましたが、PHP側で解読されませんでした...そのページ上のphp-examples PHPには数多くのパラメータを持つ非常に多くのopenssl-functionがあります - 私は自分自身をすべて理解することができません... arrrg。 – MojitoJoe

+0

さらに、セキュリティは "openssl_seal"のような暗号化のためのランダムな鍵を生成していますので、これは私の質問に対する答えにはなりませんが、正しく動作させることに感謝します。 – MojitoJoe

関連する問題