Что является Android-аналогом шифрования с открытым-закрытым ключом с помощью openssl_seal & openssl_open (оба PHP)? - PullRequest
0 голосов
/ 25 июля 2011

Я только начал разрабатывать Android-приложение, которое должно взаимодействовать с сервером / базой данных. На стороне сервера я использую PHP для сбора данных или выполнения запросов. Я много читал о безопасности (XSS, SQL-инъекции и т. Д.). Поскольку я также хотел бы зашифровать данные, передаваемые между клиентом и сервером, я начал работать с openssl-функциями в PHP.

Функции 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 и используемый для расшифровки.

Два ключевых файла были созданы в Windows с использованием

  • "openssl.exe genrsa -out private.key 1024" для файла privateKey
  • "openssl.exe rsa -in private.key -out public.pem -outform PEM -pubout" для файла publicKey

В PHP все это работает как положено.

Но как реализовать ту же технику в Android (а я новичок!)?

Я искал в Интернете примеры для использования вместе с openssl_seal на стороне PHP, но не нашел ничего работающего.

  1. Я бы хотел иметь возможность шифровать данные на стороне Android и расшифровывать это на PHP.
  2. И когда сервер отправляет зашифрованные данные, они должны быть расшифрованы на стороне Android (я полагаю, со второй парой public / privateKey)

Я также реализовал пример, упомянутый здесь , но это не сработало (openssl_private_decrypt всегда был FALSE на стороне PHP). Так что это мне не помогло, тогда как шифрование Android => PHP было бы без обратного.

В итоге: я ищу способ шифрования и дешифрования данных, передаваемых между Android и PHP на каждой стороне, где только получатель может расшифровать данные. Кто-нибудь может дать мне пример или даже подсказку?

Ответы [ 2 ]

0 голосов
/ 25 июля 2011

Если вы действительно хотите выполнить шифрование вручную, это тоже возможно.

В пакете javax.crypto содержатся необходимые классы, необходимые здесь (вместе с некоторыми из ).java.security и подпакеты), в основном класс Cipher.

На этой странице с именем RSA-шифрование в Java показан пример этого.

Вместодля загрузки открытого ключа из файла в сериализованном формате вы можете использовать механизм хранилища ключей Java (и включить хранилище ключей в свой jar или любой другой формат, используемый в Android).

0 голосов
/ 25 июля 2011

Обычным способом сделать это будет не (прямое) асимметричное шифрование, а использование зашифрованного (и аутентифицированного) канала для отправки данных, например, с использованием SSL / TLS.

На стороне сервера,вам просто нужно настроить свой веб-сервер так, чтобы он также предоставлял доступ HTTPS.

На стороне клиента, я полагаю, проще всего было бы использовать URL-адрес HTTPS для отправки данных:

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 сервера (в его сертификате) для аутентификации соединения и согласования сеансового ключа.для симметричного шифрования.

...