ASN.1 простыми словами (кодирование типа REAL)
Введение для Хабра
Приведённый ниже текст является на самом деле первыми двумя главами моей статьи "ASN.1 простыми словами". Так как сама статья достаточно большая по меркам Хабра я решил сначала проверить являются ли знания по кодированию простых типов востребованными на этом ресурсе. В случае положительной реакции аудитории я продолжу публикацию всех остальных глав.
ASN.1 простыми словами (часть 2)
ASN.1 простыми словами (часть 3, заключительная)
Free ASN.1:2008 compliance test suite
Повышаем безопасность закрытых ssh-ключей
Я использую ssh каждый день много раз — когда запускаю
git fetch
или git push
, когда развертываю код или логинюсь на сервере. Не так давно я осознал, что для меня ssh стал магией, которой я привык пользоваться без понимация принципов ее работы. Мне это не сильно понравилось — я люблю разбираться в инструментах, которые использую. Поэтому я провел небольшое исследование и делюсь с вами результатами.По ходу изложения встретится много аббревиатур. Они не помогут понять идеи, но будут полезны в том случае, если вы решите погуглить подробности.
Итак, если вам доводилось прибегать к аутентификации по ключу, то у вас, скорее всего, есть файл
~/.ssh/id_rsa
или ~/.ssh/id_dsa
в домашнем каталоге. Это закрытый (он же приватный) RSA/DSA ключ, а ~/.ssh/id_rsa.pub
или ~/.ssh/id_dsa.pub
— открытый (он же публичный) ключ. На сервере, на котором вы хотите залогиниться, должна быть копия открытого ключа в ~/.ssh/authorized_keys
. Когда вы пытаетесь залогиниться, ssh-клиент подтвержает, что у вас есть закрытый ключ, используя цифровую подпись; сервер проверяет, что подпись действительна и в ~/.ssh/authorized_keys
есть открытый ключ, и вы получаете доступ.Что же хранится внутри закрытого ключа?
Разбираем x.509 сертификат

Привет, %username%!
Так уж вышло, что несмотря на относительно неплохое понимание инфраструктуры открытых ключей, содержимое *.crt файлов всегда оставалось для меня полнейшей загадкой.
Нет, не поймите неправильно. Я знаю, что x.509 сертификат содержит информацию о владельце, открытый ключ, сведения об удостоверяющем центре и электронную цифровую подпись. Но при установке очередного сертификата меня всегда мучило любопытство.
Чем отличается идентификатор ключа от отпечатка? Какие данные сертификата подписываются, а какие нет? И что за структура данных позволяет хранить всю эту информацию, сводя избыточность к минимуму.
Но вот наконец-то любопытство перебороло лень и в данном посте я постараюсь описать структуру x.509 сертификатов и ответить на эти и другие вопросы.
PKI (Public Key Infrastructure) с помощью JavaScript? Теперь это возможно с помощью библиотек PKIjs и ASN1js
Дабы привлечь читателей прямо во введении приведу краткий список особенностей вышеупомянутых библиотек:
- Объектно-ориентированный код;
- Работа с HTML5 (ArrayBuffer, Promises, WebCrypto (используется «dev nightly build» Google Chrome));
- Возможность создавать, проверять, получать внутренние данные, изменять данные для следующих объектов:
- Сертификаты X.509
- Списки отзыва (CRL) X.509
- Запросы на сертификат (PKCS#10)
- OCSP запросы;
- Ответы OCSP сервера
- Time-stamping (TSP) запросы
- Ответы TSP сервера
- CMS Signed Data
- CMS Enveloped Data
- Реализация собственной «certificate chain validation engine» на JavaScript;
- … И многое другое! Смотрите под катом!
ASN1js и PKIjs — год после создания
Итак, текущие основные особенности PKIjs:
- Полная поддержка Web Cryptography API;
- Ограниченная возможность использования как в iPhone (через использование Safari), так и в Android приложениях (Google Chrome);
- Расширилось количество примеров. В частности, добавились примеры использования PKIjs для проверки подписей в PDF файлах и для проверки подписей в S/MIME;
- Использование всех алгоритмов подписи из Web Cryptography API:
- RSASSA-PKCS1-v1_5 (PKCS#1 v1.5);
- RSA-PSS (PKCS#1 v2);
- ECDSA (подпись на ECC, Elliptic Curve Cryptography);
- Первая реализация «certificate chain verification engine» (верификация цепочки сертификатов) на чистом JavaScript и проходящая основные тесты NIST;
- Первая и пока единственная реализация «Suite B» для подписи и шифрования данных в виде CMS (Cryptographic Message Syntax) в «open-source» на чистом JavaScript;
- Подпись CMS с помощью ECDSA;
- Шифрование с применением схем «ephemeral-static» ECDH;
- Использование AES-CBC и AES-GCM;
- Использование расширенного списка алгоритмов хеширования: от SHA-1 до SHA-512;
- Возможность создания зашифрованных сообщений на основе использования пароля с использованием алгоритмов серии AES;
Структура PKCS7-файла
Довелось мне на днях столкнуться с такой напастью как p7s файл и, как вследствие этого, с Cryptographic Message Syntax (CMS). На хабре нашлась интересная статья описывающая структуру CMS данных, но в ней к сожалению нет примера, позволяющего наглядно продемонстрировать CMS на практике. Я хочу немного дополнить ту статью и разобрать внутренности файла цифровой подписи p7s.
Разбираем квалифицированные сертификаты X.509 в поисках ИНН, СНИЛС и ОГРН

Поскольку написанием парсера было предложено заняться мне, пришлось задуматься и покопаться в памяти, чтобы оценить трудоемкость задачи и примерные сроки на ее выполнение.
Когда-то я участвовал в небольшом проекте по моделированию SSL MITM, где отвечал за генерацию ключей и сертификатов для этого самого «человека посередине». Поэтому представлял, что квалифицированный сертификат ключа проверки электронной подписи (далее — квалифицированный сертификат) — это сертификат X.509, для описания внутренней структуры которого используется
Вот только не помнил я, чтобы тогда на глаза попадались эти ИННы, СНИЛСы и ОГРНы. Поэтому ответил более, чем скромно: «Босс, два дня, не меньше!», надеясь выполнить задачку за несколько часов.
Ниже рассказ о том, насколько сильно я ошибся в расчетах, а также готовое решение для парсинга сертификатов X.509 на C# с возможностью извлечения полей и их атрибутов с заданными объектными идентификаторами (OID).
Автоматическая сериализация Java-объектов в ASN.1
ASN.1 — стандарт описания протоколов передачи данных. Вот уже 8 лет не дает покоя тот факт, что существуют либо слабые попытки его использовать, практически не прибегая к его полному функционалу, либо же это монстры за большие деньги, используемые отнюдь не рядовым Васей.
Причем и те и другие наследуют одни и те же черты — неудобство, перегруженность дополнительными действиями и генерацией совсем бесполезных заглушек.
На хабре появлялось уже достаточно много статей с описанием всех прелестей ASN.1, рекомендую почитать их.
Вашему вниманию предлагаю альфа-версию библиотеки, позволяющей в стиле hibernate или jackson-databind сохранить ваши данные в бинарном виде. Пока поддерживаются только нотации BER(DER).
Смарт-карты. Часть 3. TLV
В прошлой части мы видели как происходит общение между терминалом и картой. Мы посмотрели форматы C-APDU и R-APDU, но мы не обращали внимания на то, какие данные содержат эти APDU. В этой части мы рассмотрим самые распространенные форматы, в которых передается информация между терминалом и картой (и наоборот). Все они относятся к одному семейству — TLV.
TLV означает Tag, Length, Value и используется для того, чтобы структурировать информацию. На очень абстрактном уровне, TLV можно рассматривать как бинарную версию XML. Однако что такое Tag, Length, Value?
- Tag: он говорит, какой вид информации находится в TLV. Видом может быть, к примеру, простая строка или номер, идентификатор или даже сложная структура. В некоторых вариантах Tag также содержит мета-информацию о TLV.
- Length: длина, в байтах, элемента Value.
- Value: данные, содержащиеся в TLV
Каждый вариант TLV имеет свои правила кодирования каждого элемента. Далее мы посмотрим самые распространенные варианты TLV. Хочу сразу отметить, что данная статья будет, в основном, посвящена BER-TLV, поскольку это самый распространенный, гибкий и сложный формат. Остальные варианты TLV будут рассмотрены лишь вкратце.
Разбираем и просматриваем квалифицированные сертификаты средствами Python/Tkinter

Инфраструктура открытых ключей. Цепочка корневых сертификатов X509 v.3

Неумолимо приближается час «Ч»: «использование схемы подписи ГОСТ Р 34.10-2001 для формирования подписи после 31 декабря 2018 года не допускается!».
Англоязычная кроссплатформенная утилита для просмотра российских квалифицированных сертификатов x509

PyDERASN: как я написал ASN.1 библиотеку с slots and blobs
В этой статье рассматривается PyDERASN: Python ASN.1 библиотека активно применяющаяся в проектах связанных с криптографией в ФГУП «НТЦ „Атлас“.

Простой ASN1-кодек на базе sprintf

GOSTIM: P2P F2F E2EE IM за один вечер с ГОСТ-криптографией
Всё это побудило меня написать данную статью, чтобы показать, что реализация криптографических протоколов и безопасного IM-а не такая сложная задача. Однако изобретать собственные протоколы аутентификации и согласования ключей не стоит.

В статье будет написан peer-to-peer, friend-to-friend, end-to-end зашифрованный instant messenger с SIGMA-I протоколом аутентификации и согласования ключей (на базе которого реализован IPsec IKE), используя исключительно ГОСТовые криптографические алгоритмы PyGOST библиотеки и ASN.1 кодирование сообщений библиотекой PyDERASN (про которую я уже писал раньше). Необходимое условие: он должен быть настолько прост, чтобы его можно было написать с нуля за один вечер (или рабочий день), иначе это уже не простая программа. В ней наверняка есть ошибки, излишние сложности, недочёты, плюс это моя первая программа с использованием asyncio библиотеки.
PyDERASN: как я добавил big-data поддержку
