Неиллюзорный адъ криптографии
Разбирался, как из rsa-ключа, сделанного openssl или ssh-keygen сделать ключ в xml-формате для C# RSACryptoServiceProvider. Типа реализовать интероперабилити между .NET и тулсами из юниксового мира.
Честно вам скажу, все-таки в микрософте люди работают более вменяемые, чем те, кто придумал формат rsa-ключа. В C# все просто - ключик в xml-файле/строке, отдельные xml-тэги, Modulus, Exponent для паблик-ключа и плюс P,Q,DP,DQ,InverseQ,D - для приватного. В тэгах - значения в base64. Читабельно, понятно и доступно тому, кто слышал как эта асимметричная криптография работает. И парсится легко.
Формат же ключа, который создает ssh-keygen и openssl genrsa, хотя и стандартный и описан в rfc - это смерть, жопа и сатана.
Во-первых, описание этого формата я еле откопал, хотя оно и в rfc. Причем толку от описания было мало, быстрее получилось дампить ключ с помощью openssl asn1parse и смотреть содержимое.
Во-вторых, начало и конец оформлено строками -----BEGIN/END RSA PRIVATE KEY-----, а между ними - base64 блок. Т.е. формат меняется прямо внутри файла - строки конца и начала ни разу не являются валидным base64.
В-третьих, в base64 блок упихнуты все компоненты ключа, в виде ASN1 последовательности, формат, известный своей "адекватностью" для парсинга.
И, что самое интересное, openssl rsa in key -noout -text показывает компоненты ключа странно - дописывает в начало некоторых лишний ноль. При этом, openssl asn1parse показывает правильно - без нуля.
В итоге, выдрал из Mono asn1 парсер (почему-то в самом .net фреймворке я его не нашел), сопоставил секции в последовательности и компоненты ключа и сгенерил таки из линуксового ключа дотнетовский. Причем ноль в начале данных компонент пришлось вырезать руками, потому-что парсер из моно тоже возвращает этот лишний ноль.
Честно вам скажу, все-таки в микрософте люди работают более вменяемые, чем те, кто придумал формат rsa-ключа. В C# все просто - ключик в xml-файле/строке, отдельные xml-тэги, Modulus, Exponent для паблик-ключа и плюс P,Q,DP,DQ,InverseQ,D - для приватного. В тэгах - значения в base64. Читабельно, понятно и доступно тому, кто слышал как эта асимметричная криптография работает. И парсится легко.
Формат же ключа, который создает ssh-keygen и openssl genrsa, хотя и стандартный и описан в rfc - это смерть, жопа и сатана.
Во-первых, описание этого формата я еле откопал, хотя оно и в rfc. Причем толку от описания было мало, быстрее получилось дампить ключ с помощью openssl asn1parse и смотреть содержимое.
Во-вторых, начало и конец оформлено строками -----BEGIN/END RSA PRIVATE KEY-----, а между ними - base64 блок. Т.е. формат меняется прямо внутри файла - строки конца и начала ни разу не являются валидным base64.
В-третьих, в base64 блок упихнуты все компоненты ключа, в виде ASN1 последовательности, формат, известный своей "адекватностью" для парсинга.
И, что самое интересное, openssl rsa in key -noout -text показывает компоненты ключа странно - дописывает в начало некоторых лишний ноль. При этом, openssl asn1parse показывает правильно - без нуля.
В итоге, выдрал из Mono asn1 парсер (почему-то в самом .net фреймворке я его не нашел), сопоставил секции в последовательности и компоненты ключа и сгенерил таки из линуксового ключа дотнетовский. Причем ноль в начале данных компонент пришлось вырезать руками, потому-что парсер из моно тоже возвращает этот лишний ноль.
no subject
no subject
no subject
no subject
Затем, что софт (и ключи эти всякие к нему комплектные) часто работает не сам по себе, а его приходится прикручивать к другому софту (и так 15 раз). А разработчики проприетарного софта на самом деле - люди отмороженные и про "все библиотеки понимают" - эт Вы сильно погорячились. Т.е. понимать то они может и понимают, но когда обратно выдают результат - это всё в пропорции к объёмом абсента, потреблённым в процессе кодописания аффтарами.
Что в свои сертфикаты/ключи для доступа к ихним информационным системам всякие банки засовывают - это ж, например, просто уму непостижимо. И когда обёртку пишешь, чтобы одно с другим стыкануть - лучше бы хотя бы приблизительно представлять, какие поля тебе прислали, а какие - решили что ты без них перебьёшься.
С этой точки зрения XML представление с отдельными полями - явно лучше, чем base64-style блок, в котором то ли стандартный ключ, то ли, например, кроме самого ключика - IP-адрес твоей системы заXORенный с фазой луны дня окончания действия ключа.
no subject
no subject
Да и генератору ключей от openssl я как-то больше доверяю, чем тому, что там RSACryptoServiceProvider, в недрах NSA червями нашпигованный, нагенерит :)
no subject
no subject
no subject
Потому что мегагуру, которые берутся разрабатывать, думают исключительно о том, как бы поохренительнее показать свою самость, чем о том, что они на самом деле делают.
no subject
no subject
no subject
гыг.
уж извините.
no subject
no subject
no subject
no subject
no subject
no subject
no subject
no subject
no subject
no subject
no subject
no subject
В общем, бессмысленное усложнение решения, судя по всему, из-за решения разработчиков протокола не заморачиваться с разделением одного потока на данные и команды. Практически, они переложили решение с себя на других.
no subject
Схема реализованная в ФТП позволяет делать вещи хоть и не часто требуемые но весьма полезные. Например используя только ФТП можно с системы А соединиться с системами В и С и передать файл с В на С. :)
Не стоит также забывать что FTP разработан в 1985 году.
Telnet и DNS - в 1983, TCP в 1981.
И до сих пор все эти протоколы активно используются, несмотря на то что прошло уже больше 20-ти лет.
ЗЫ. А что значит "Практически, они переложили решение с себя на других"? Какое решение?
no subject
no subject
Таких уёбищных приложений, написанных на чём-то типа MFC, через жопу заинтегренных с вебом, через нашпингованные ActiveX странички... Бля, если это - приличный софт, то покажите мне уродский софт, пожалуйста.
no subject
По мне так "приличный софт" - это такой софт, который невозможно заменить чем-то ещё, руководствуясь сисадминским нравстенным чувством, "софт уважаемых контрагентов" с которым, хоть на стенку влезь, но надо сынтегрироваться.
Таких уёбищных приложений, написанных на чём-то типа MFC, через жопу заинтегренных с вебом, через нашпингованные ActiveX странички... Да, Вы примерно уловили мою идею. К перечислению следует добавить "экспортирующих свои ключи мужской половой хуй знает в каком формате" - о чём, собственно говоря, и речь.
no subject
ну да, разумеется, (де)мультиплексирование команд и данных в одном потоке силами разработчика прикладного софта - это у нас теперь называется 'одной сущностью', а когда оно же переложено на _штатный_ стек сетевого протокола - это у нас "две сущности".
Практически, они переложили решение с себя на других.
Да-да. Настоящие самураи внутрь каждой утилиты встраивают целиком операционную систему собственного написания ;-)
no subject
no subject
no subject
Дело не в том что кто-то мыслит категориями 1985-го года, а в том что почему то за более чем 20 лет этот "безумный" ФТП не был задавлен более удобным протоколом, как например случилось ч тем же гофером.
Может все же проблема не в ФТП, а? %))
no subject
Ведь всем очевидно, что реализовать обмен командами и данными по одному сокету на порядки проще чем заморачиваться с безумным и непонятным IPC! :)
А уж написание сервера то как облегчается :)))