Могу ли я использовать OpenSSL только для шифрования параметров URL? - PullRequest
1 голос
/ 10 мая 2011

Мне просто нужна схема шифрования с открытым ключом, которую я могу использовать для шифрования параметров, отправляемых приложением iPhone в PHP на сервере. Я не могу использовать GnuPG из-за его лицензии.

Требования состоят в том, чтобы приложение на телефоне могло взаимодействовать с сервером без ввода пользователем учетных данных. Моя цель здесь состоит в том, чтобы предотвратить проверку параметров в URL-адресе и злоупотребление нашей системой путем подмены. Таким образом, в целях шифрования все копии нашего приложения могут выглядеть как один и тот же пользователь.

Я не планировал использовать HTTPS, потому что (если я не ошибаюсь) ему нужны сеансы или сертификаты, и это кажется чрезмерным (но дайте мне знать, если нет); Мне просто нужно зашифровать и расшифровать часть параметра URL.

Поскольку данные для шифрования с помощью открытого ключа RSA должны быть короче, чем ключ, стандартная процедура состоит в том, чтобы сгенерировать симметричный закрытый ключ, зашифровать его с помощью открытого ключа, зашифровать данные сгенерированным секретным ключом и затем отправить сгенерированный закрытый ключ и зашифрованные данные на сервер. Похоже, у меня есть большая часть того, что мне нужно для шифрования сгенерированного ключа (за исключением RSA_size (), сбой в процессе). Но я не знаю, как задать и настроить кодировку массовых данных с помощью Blowfish или какого-либо другого алгоритма, поддерживаемого PHP.

Спасибо за понимание.

Ответы [ 3 ]

2 голосов
/ 10 мая 2011

Это возможно.

Вы можете просто использовать криптографические алгоритмы с открытым ключом RSA без каких-либо накладных расходов и инфраструктуры, которую оборачивает PGP или X.509v3.

  1. Создайте пару открытый-закрытый ключ.
  2. Безопасно храните закрытый ключ на сервере.Хорошо защитите его.
  3. Распространите открытый ключ в приложении iPhone.
  4. Приложение iPhone шифрует данные с помощью открытого ключа.
  5. Приложение iPhone отправляет зашифрованные данные всервер.
  6. Сервер расшифровывает зашифрованные данные с помощью закрытого ключа.

С этой идеей можно поиграть, используя инструменты командной строки openssl:

На сервере запустите:

$ openssl genrsa -out myprivatekey.pem 2048
$ openssl rsa -in myprivatekey.pem -pubout -out mypublickey.pem

Скопируйте mypublickey.pem на клиент, а на клиенте создайте некоторые данные в data.dat и выполните:

$ openssl rsautl -encrypt -pubin -inkey mypublickey.pem -in data.dat -out enc.dat

Отправьте код.dat на сервер, а затем на сервере запустите:

$ openssl rsautl -decrypt -inkey myprivatekey.pem -in enc.data -out data2.dat

Открытый ключ не нужно защищать, поэтому вы можете распространять его в приложении iPhone любым удобным для вас способом.Например, вставьте его в приложение, поместите на общедоступный веб-сервер, отправьте клиенту по небезопасной электронной почте.Нет проблем, если плохие парни возьмутся за это.

Примечание: в примере я создал 2048-битный ключ RSA.Имейте в виду, что для асимметричных алгоритмов (то есть алгоритмов с открытым ключом) вам нужны ключи большей длины в битах, чтобы обеспечить тот же уровень безопасности, что и ключи, используемые для симметричных алгоритмов.Не думайте, что 128-битное шифрование AES является очень надежным, поэтому я просто создам 128-битный ключ RSA - это слишком мало для ключа RSA и не даст вам ожидаемого уровня безопасности.

Теперь вам просто нужно реализовать это, вызывая библиотеки openSSL в коде.

1 голос
/ 10 мая 2011

Я думаю, и я не очень уверен - если вам нужно зашифровать данные для отправки, и вы не подключены через HTTPS, то вы можете попробовать реализовать какой-нибудь модуль шифрования JS. (Я нашел http://www.hanewin.net/encrypt/) Вы можете сгенерировать ключи на основе имени пользователя или имени клиентского компьютера.

0 голосов
/ 10 мая 2011

Другой возможностью является не использование шифрования с открытым / закрытым ключом, а шифрование с симметричным ключом.Вероятно, вы захотите сделать так, чтобы в каждом сеансе клиентское приложение генерировало ключ, использовало одно HTTPS-соединение для отправки того ключа, который сервер может использовать для расшифровки параметров.Теперь все ваши обычные соединения могут иметь зашифрованный параметр, используя тот ключ, который знают только клиент и сервер.Он должен быть уникальным для каждого устройства и, возможно, для сеанса.Возможно, вы захотите связать отметку времени с ней, чтобы вы знали, что после того, как она неактивна в течение длительного времени, она может быть отброшена или воспринята как происходящая из недопустимого сеанса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...