ASN.1 кодирование-декодирование - PullRequest
6 голосов
/ 11 мая 2011

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

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

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

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

Спасибо !!

Ответы [ 4 ]

8 голосов
/ 11 мая 2011

То, что 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 зависит от этого, но получение сертификата, подписанного «доверенным» CA, ничего не значит;любой центр сертификации может подписать любой домен, и после просмотра того, чему ваш браузер доверяет по умолчанию, я больше не доверял своему браузеру.

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

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

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

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

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

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

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

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

...