OpenSSL SSL шифрование
-
23-09-2019 - |
Вопрос
Я хочу обсудить о методе записи и чтения 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;)