Кодирование-декодирование ASN.1

#java #c #openssl #asn.1 #bc

#java #c #openssl #asn.1 #bc

Вопрос:

В настоящее время я разрабатываю клиент-серверную программу, клиент на Java / C и сервер на C. Я должен передать криптографические данные (например, клиент должен передать данные на сервер для шифрования / дешифрования, дайджеста вычислений и т.д.), А сервер должен вернуть результат клиенту.

В этом сценарии я осознаю важность использования некоторого транспортного протокола для идентификации данных и эффективной передачи данных.

В связи с этим мой вопрос таков: является ли ASN.1 хорошим протоколом для использования? Я знаю, что это поддерживается BC (на Java) и OpenSSL на C. Итак, хорошая ли идея передавать данные между клиентом и сервером с использованием обозначения ASN.1?

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

Спасибо!!

Комментарии:

1. ASN.1 — это кодировка, а не протокол. Он предоставляет стандарт сериализации данных для сетевого транспорта. Я не уверен в эффективности ASN.1, но я был бы больше обеспокоен надежностью вашей реализации, прежде чем ее эффективностью.

Ответ №1:

То, что поддерживают BC и OpenSSL, является лишь очень малой частью ASN.1. Фактически, долгое время не было полной реализации ASN.1, доступной, по крайней мере, для общественности. Телекоммуникационные компании и производители телефонного оборудования, вероятно, имеют довольно полные реализации ASN.1. На данный момент самая продвинутая реализация ASN.1, доступная для общественности, разрабатывается как часть проекта OsmoCom, о чем Харальд Вельте написал в блоге: http://laforge.gnumonks.org/weblog/2011/04/12#20110412-mapv1_available

И что еще хуже, ASN.1, в частности, схемы кодирования с высокой избыточностью (в ASN.1 существует по крайней мере 3 разных способа кодирования строк), в последние годы были причиной нескольких проблем безопасности из-за проблем, которые это вызывало при правильной обработке сертификатов x509. x509 — еще одна сломанная технология из ада, и ИМХО ее лучше избегать. Конечно, SSL зависит от этого, но получение сертификата, подписанного «доверенным» центром сертификации, ничего не значит; любой центр сертификации может подписать для любого домена, и после просмотра того, чему ваш браузер доверяет по умолчанию, я больше не доверял своему браузеру.

Итак, чтобы сделать длинную историю короткой: ASN.1 сломан, и его следует избегать в новых проектах. Единственное широко распространенное использование за пределами телефонных сетей — это x509, который тоже сломан. Таким образом, я бы не стал его использовать. Используйте JSON, BSON, буферы протокола, сетевые строки или что-то вменяемое.

Комментарии:

1. Единственная проблема в том, что мой сервер C является встроенной системой, и я не хочу использовать некоторые дополнительные библиотеки с большими накладными расходами. Я предположил, что asn.1 — это вариант библиотек openssl, которые я уже использую на стороне сервера: (

2. @pimmling: Как я уже сказал, OpenSSL реализует только очень ограниченное подмножество ASN.1, а именно только те части, которые требуются для обработки сертификатов x509. Кроме того, BSON и протокольные буферы чрезвычайно легковесны: реализация BSON на C составляет всего 700 строк кода.

3. Спасибо datenwolf! У меня небольшая путаница. Как я понимаю, эти протоколы помогают в сериализации данных. Как и в, они помогают вам поместить все ваши данные в красивый массив с определенными заголовками, чтобы его было легче развернуть с другой стороны. Теперь, что, если я сам напишу этот протокол? скажем, определите заголовок сообщения, который мой сервер и клиент могут использовать для обмена данными. Почему и как важны эти важные схемы сериализации?

4. Без придания вашим данным некоторой структуры получающая сторона не имеет возможности расшифровать, что к чему. Сначала вам нужно убедиться, что получаемые вами данные на самом деле представлены в каком-то понятном вам формате, иначе все дерьмо, которое может быть отправлено случайно или злонамеренно, приведет к остановке вашего процесса. Также, если ваши данные имеют какую-то структуру, вам необходимо передать и отформатировать их системно независимым способом. Никогда не передавайте необработанную структуру данных по сети, иначе начнется ад. Проектирование хороших транспортных контейнеров сложно, писать надежные анализаторы сложно. Лучше использовать какую-нибудь проверенную существующую библиотеку.

5. Самая продвинутая реализация ASN.1, доступная широкой публике, определенно не является тем, что использует OsmoCom, они используют исправленную версию ASN1C Льва Уокина. ASN1C даже не поддерживает ASN1 2002. Возможно, вы путаете «общедоступный» со «свободным».

Ответ №2:

ASN.1 жив и здоров и используется во многих стандартных протоколах, как старых, так и новейших, включая несколько стандартов, которые в настоящее время разрабатываются (например, в рамках 3GPP и IEEE 802). На рынке доступно несколько хороших и полных коммерческих инструментов ASN.1. Типичный инструмент ASN.1 включает компилятор ASN.1, который может генерировать исходный код из определений сообщений ASN.1, а также библиотеки кодирования / декодирования для различных стандартных правил кодирования. Обычно разработчик приложения пишет код, который использует структуры данных, сгенерированные компилятором ASN.1, и вызывает функции кодирования / декодирования, предоставляемые как часть инструмента ASN.1.

Если вы не хотите приобретать коммерческий инструмент ASN.1 (по какой-либо причине), и если вы собираетесь писать свои собственные определения сообщений ASN.1 (в отличие от внедрения существующего стандартного протокола), возможно, вы могли бы выбрать один из доступных бесплатных инструментов ASN.1 и ограничить использование ASN.1 синтаксическими функциями, которые поддерживаются выбранным вами инструментом.

Ответ №3:

ASN.1 стал чем-то вроде ниши, используемой для данных, связанных с X.509, и ни для чего другого.

Возможно, вы захотите вместо этого взглянуть на буферы протокола Google.

Комментарии:

1. Нельзя ли использовать ASN.1 для передачи открытых ключей или зашифрованных текстов AES и т.д.?

2. Да, но вы обнаружите, что это медленно и сложно в использовании.

3. Он широко используется в телекоммуникациях, включая четыре ключевых интерфейса LTE, это не ниша. Это не медленно, но сложно в использовании.

4. Хорошо, ASN.1 по своей сути не является медленным, но удачи в поиске хорошей чистой библиотеки с открытым исходным кодом / бесплатной библиотеки.

Ответ №4:

На случай, если вы действительно хотите использовать ASN.1 в Java: я просмотрел библиотеки ASN.1 с открытым исходным кодом для java и обнаружил, что пригодными для использования являются только BinaryNotes. Инструмент не поддерживает все современные специализированные функции ASN.1 (точки расширения и т.д.), Но для определения вашей собственной базовой грамматики ASN.1 и генерации классов java, способных кодировать / декодировать эти сообщения, он весьма полезен, затратив на это совсем немного усилий.

Для части C коллеги использовали ASN.1C для компиляции КОДЕКА без грамматики ASN.1 — но я не знаю никаких подробностей.

Комментарии:

1. Является ли ASN.1 хорошей кодировкой для использования в ситуации, изложенной в вопросе? Почему или почему нет?

2. Это так же хорошо или так же плохо, как GoogleProtocolBuffers — кодировка структурированных данных, не зависящая от языка. Акцент в ASN.1 делается на эффективности, особенно на пропускной способности и эффективности синтаксического анализатора, если ваш встроенный клиент C имеет низкую вычислительную мощность, на ASN.1 определенно стоит обратить внимание — часть OpenSSL ASN.1, однако, ИМХО, не подходит для пользовательских сообщений с пользовательской грамматикой ASN.1 — она предназначена для де- и кодирования обычных данных, таких как X.509, поэтому вашей первой отправной точкой было бы посмотреть, можно ли использовать командную строку openssl asn1parse ... для кодирования любых данных, которые могут подойти ваш вариант использования