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

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

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

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

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

Спасибо!!


person pimmling    schedule 11.05.2011    source источник
comment
ASN.1 — это кодировка, а не протокол. Он обеспечивает стандарт сериализации данных для сетевого транспорта. Я не уверен в эффективности ASN.1, но меня больше беспокоит надежность вашей реализации, прежде чем ее эффективность.   -  person this.josh    schedule 25.05.2011


Ответы (4)


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

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

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

person datenwolf    schedule 11.05.2011
comment
Единственная проблема заключается в том, что мой C-сервер является встроенной системой, и я не хочу использовать дополнительные библиотеки с большими накладными расходами. Я предположил, что asn.1 является частью библиотек openssl, которые я уже использую на стороне сервера :( - person pimmling; 11.05.2011
comment
@pimmling: Как я уже сказал, OpenSSL реализует только очень ограниченное подмножество ASN.1, а именно только те части, которые необходимы для обработки сертификатов x509. Кроме того, BSON и Protocol Buffers чрезвычайно легки: реализация BSON на языке C состоит всего из 700 строк кода. - person datenwolf; 11.05.2011
comment
Спасибо, datenwolf! У меня небольшая путаница. Насколько я понимаю, эти протоколы помогают в сериализации данных. Например, они помогают вам поместить все ваши данные в красивый массив с определенными заголовками, чтобы их было легче развернуть с другой стороны. А что, если я сам напишу этот протокол? скажем, определить заголовок сообщения, который мой сервер и клиент могут использовать для связи. Почему и как важны эти важные схемы сериализации? - person pimmling; 11.05.2011
comment
Без придания вашим данным некоторой структуры получатель не сможет расшифровать, что к чему. Сначала вам нужно убедиться, что данные, которые вы получаете, действительно представлены в каком-то формате, который вы понимаете, иначе все дерьмо, которое может быть отправлено случайно или злонамеренно, приведет к остановке вашего процесса. Кроме того, если ваши данные имеют какую-то структуру, вам необходимо передавать и форматировать их независимым от системы способом. Никогда не передавайте необработанную структуру данных по сети, иначе разверзнется ад. Проектировать хорошие транспортные контейнеры сложно, писать надежные синтаксические анализаторы сложно. Лучше использовать проверенную существующую библиотеку. - person datenwolf; 11.05.2011
comment
Наиболее продвинутая реализация ASN.1, доступная общественности, определенно не используется OsmoCom, они используют исправленную версию ASN1C от Льва Уолкина. ASN1C даже не поддерживает ASN1 2002. Возможно, вы путаете общедоступное с бесплатным. - person ; 11.10.2011
comment
@lttlrck: под общедоступным я имел в виду: общедоступный в виде исходного кода. Теперь, если есть другая, более продвинутая реализация ASN.1 с открытым исходным кодом, я очень заинтересован в ней. - person datenwolf; 11.10.2011

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 синтаксическими функциями, поддерживаемыми выбранным вами инструментом.

person Alessandro    schedule 12.05.2011

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

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

person bmargulies    schedule 11.05.2011
comment
Можно ли использовать ASN.1 для передачи открытых ключей или зашифрованных текстов AES и т. д.? - person pimmling; 11.05.2011
comment
Да, но вы найдете его медленным и сложным в использовании. - person bmargulies; 11.05.2011
comment
Он широко используется в телекоммуникациях, включая четыре ключевых интерфейса LTE, это не ниша. Это не медленно, но сложно в использовании. - person ; 11.10.2011
comment
Хорошо, ASN.1 по своей сути не медленный, но удачи в поиске хорошей чистой библиотеки с открытым исходным кодом/бесплатной. - person bmargulies; 12.10.2011

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

Что касается части C, коллеги использовали ASN.1C для компиляции кодека из грамматики ASN.1. - но я не знаю никаких подробностей.

person BertNase    schedule 12.05.2011
comment
Является ли ASN.1 хорошей кодировкой для ситуации, изложенной в вопросе? Почему или почему нет? - person this.josh; 25.05.2011
comment
Это так же хорошо или так же плохо, как GoogleProtocolBuffers — независимое от языка кодирование структурированных данных. Акцент в ASN.1 делается на эффективность, особенно на пропускную способность и эффективность синтаксического анализатора, если ваш встроенный клиент C имеет низкую вычислительную мощность, ASN.1 определенно стоит обратить внимание - часть ASN.1 openSSL, однако, ИМХО не подходит для пользовательских сообщений пользовательской грамматики ASN.1 - это для декодирования и кодирования общих данных, таких как X.509, поэтому вашей первой отправной точкой будет посмотреть, можно ли использовать командную строку openssl asn1parse ... для кодирования любых данных, которые могут подойти ваш вариант использования - person BertNase; 26.05.2011