Вопрос

Я хочу обсудить о методе записи и чтения OpenSSL.
Предположим, что у меня есть структура данных, как ниже:

/-----------------------------------------------------\
|  my_header   |  PAYLOAD                             |
\-----------------------------------------------------/
       |                              |
      \ /                            \ /
 not encrypted                      encrypted

I think the proper algorithm would be like this :
   SEND:
   build my_header with my own header.
   encrypt PAYLOAD with encryption function
   attach my_header and PAYLOAD (encrypted) to one buffer
   send it using common POSIX function just like send or sendto
   RECV:
   using common POSIX function just like recv or recvfrom.
   extract my_header and PAYLOAD(encrypted)
   decrypt PAYLOAD with decryption function
   at last i got my_header and PAYLOAD(decrypted).

Как ваш подход, если вы сталкиваетесь с проблемой, как выше. Поскольку openssl шифрует все данные, которые отправляются в функцию ssl_write (cmiiw).

Спасибо.

Может быть, апроприночный вопрос: какова функция шифрования и дешифрования, которую можно использовать для шифрования/дешифрования полезной нагрузки в OpenSSL?

Нет правильного решения

Другие советы

Вы можете позволить OpenSSL сделать для вас много тяжелой работы.

Вы можете создавать свои примитивы с сетью, как и раньше, и связывать дескрипторы файлов с открытым контекстом SSL, который будет обрабатывать рукопожатие SSL, шифрование и дешифрование. Я засуряю много деталей, но пример кода на веб -сайте OpenSSL и в этой книге:

http://www.amazon.com/network-security-openssl-john-viega/dp/059600270x

будет очень поучительным. Книга также доступна в Интернете, но я считаю, что вы должны заплатить, чтобы получить к ней доступ.

В распределении OpenSSL вы можете найти множество примеров кода, иллюстрирующего именно то, как это сделать.

Удачи.

OpenSSL поставляется с библиотекой LibCrypto, которая обычно используется для выполнения автономного шифрования вне контекста SSL.

http://www.openssl.org/docs/crypto/evp.html

В качестве альтернативы, био -часть библиотеки может быть еще ближе к тому, что вы хотите:http://www.openssl.org/docs/crypto/bio.html

Но если вы действительно собираетесь отправить это по сети, я бы поставил под сомнение безопасность оставления заголовка незашифрованным. Шифрование - это нечто большее, чем конфиденциальность, это также о том, чтобы данные не были изменены при транспортировке. Если кто -то в состоянии контролировать ваш трафик, то он, как правило, также в состоянии вмешиваться в него.

Если вы хотите, чтобы заголовок некрифтировался, чтобы вы могли прочитать его в Wireshark для отладки, то я предлагаю сделать флаг в вашем приложении, чтобы полностью включить/отключить шифрование для использования в среде отладки.

Если вы строите зашифрованный протокол, это именно то, как я бы сделал это, предполагая my_header Содержит достаточное количество информации и ничего, что само по себе не должно быть безопасным, например, ключ сеанса. Сетевые пакеты на низком уровне (см. TCPDUMP/LibpCap) - это просто char* («String»), и вы извлекаете разные заголовки, перемещаясь по массиву по -разному - то, что вы предлагаете, звучит так же.

Когда вы используете TLS/DTLS, у вас есть выбор: вы заполняете всю кадр или вообще ничего.

Если вы хотите иметь в кадре несколько неразританных данных, то вам, вероятно, не нужны TLS/DTL. Однако вы можете использовать OpenSSL для вычисления хэша вашего заголовка (с использованием SHA или любого другого связанного хэш -алгоритма) и добавления его в конце кадра, чтобы избежать подделки.

Для зашифрованной части кадра вам придется выбирать между символическими и асиметрическими алгоритмами шифра. Но, не зная того, чего вы хотите достичь, я не могу посоветовать по этому поводу.

Просто имейте в виду, что симтрические алгоритмы обычно быстрее, но сначала требуют обмена ключами. Для этого вы можете использовать асиметрический алгоритм, но тогда вы переосмысливаете TLS/DTLS;)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top