Recent Blog Postshttp://muromec.org.ua/feed.atom2019-12-09T00:00:00ZRecent blog postsWerkzeugОб'яваhttp://muromec.org.ua/2019/12/nl2019-12-09T00:00:00ZIlya Petrov<p>Поскольку на Югах стало как-то совсем жарко через етот самий клімат ченж, пришлось записатьсі в кліматичні біженці та переїхать в місто Амстердам.</p>
<p>З об'єктивних причин в бложеку накладено санкції на букви "Ы" та "Э" до момену коли кацапня не перестане убивати людей на Сході та в Криму.</p>
Практика применения цифровой подписиhttp://muromec.org.ua/2015/01/edoc2015-01-23T00:00:00ZIlya Petrov<p>В Украинском окологосударственном айти, есть такая шикарная штука, как цифровая повинность.
Заключается она в том, что государство в какой-то момент решило, что для сдачи электронной
отчетности и вообще для идентификации человека в интернете, нужна цифровая подпись и требует
ее от собственно сдающих отчетность (подписывать) и от поставщиков всяких сайтов-шмайтов для
себя, чтобы ЭЦП там поддерживалось. Казалось бы - торжество криптомафии, удобства и вот этого всего.
Ну это если вы конченый технарь-прогромист и не следите за руками.</p>
<div class="section" id="section-2">
<h2>Наебка первая</h2>
<p>Наебка первая заключается в том, что считается ЭЦП. ЭЦП - это понятие не техническое, а юридическое,
более того, с этими нашими Європами, нужно еще и квалифицированную ЭЦП. То есть например GPG - это
не ЭЦП, персональный сертификат ключа, где личность проверена каким-нибудь Verisign - тоже нет ниразу.
Сертификат сайта - это вообще никак не ЭЦП, потомучто удостоверяет объект (сайт), а не субъекта,
которому он принадлежит (юрика или физика). Сертификат сайта, где Verisign все же проверил субъекта
и браузер пишет зелененьким "Twitter Inc" - все равно не ЭЦП. Ну то есть ЭЦП - это не та вся хуйня,
которую нормальные люди юзают для полезного дела, а справка, которая нужна чиновнику.</p>
<p>Чтобы получился ЭЦП, надо сначала получить сертификат у специального украинского CA которых конечно
есть несколько, включая государственный, который выдает сертификаты бесплатно.</p>
<p>Сертификат - обычный X509v3, такой же самый, что используется в HTTPS и TLS вообще. Ну то есть нет.
Там конечно же X509v3, но в Subject Name записано ваше имя украинской кирилицей, как в паспорте,
а где-то очень далеко в недрах экстеншенов еще и ИНН (он же ДРФО). Ну и конечно такой сертификат
нельзя импортировать в кейчейн броузера или скормить openssl, потомучто там используется не богомерзкий
и дырявый RSA или там ECDSA с кривущими SHA-1 и MD-5, а национальное достояние - алгоритм ДСТУ 4145,
самый лучший алгоритм, быстрый и безопасный ЭЦП в мире (по версии Державной Службы СпецЗв`язку).</p>
<p>Окей, все мастера PHP убежали, остались привычные ко всякой хуйне прогромисты, которые и не такое видели.
Ну еще один несовместимый кусок говна, щас мы алгоритм реализуем, сертификат распарсим, нахуярим
патчик на OpenSSL, чтобы все это проинтегрировать и будет счастье. Вы не первый такой умный - все уже
собрано и лежит в <a class="reference external" href="https://launchpad.net/~ilya-muromec/+archive/ubuntu/openssl-dstu/">PPA</a>.</p>
</div>
<div class="section" id="section-3">
<h2>Наебка вторая</h2>
<p>И так, у нас был <a class="reference external" href="http://crypto.org.ua/downloads">патч на SSL</a>, <a class="reference external" href="https://launchpad.net/~ilya-muromec/+archive/ubuntu/openssl-dstu/">сборка под убунту</a>, <a class="reference external" href="https://github.com/dstucrypt">репоз на гитхабе</a>, два пакета с <a class="reference external" href="https://www.npmjs.org/package/node-gost89">гостом</a> и <a class="reference external" href="https://www.npmjs.org/package/node-gf2m">f2m</a> под ноду, <a class="reference external" href="https://launchpad.net/~ilya-muromec/+archive/ubuntu/dstud">демон на OpenSSL+re</a>,
<a class="reference external" href="https://github.com/dstucrypt/ukurwa4145">реализация подписатора и проверятора на пайтоне</a>, <a class="reference external" href="https://www.npmjs.com/package/jkurwa">разбиралка сертификатов и форматов для клиентского жаваскрипта</a>,
<a class="reference external" href="https://www.npmjs.com/package/jkurwa">конвертер ключей</a>, <a class="reference external" href="https://github.com/indutny/asn1.js/pulls?q=is%3Apr+is%3Aclosed">десять багов в ASN.1 парсере</a> и <a class="reference external" href="https://eusign.org/">шлюз аутентификации</a>, экспортирующий проверку юзеров через OAuth2.
Не то чтобы это все как-то помогло хоть кому-то, но если ты программист и видишь ненаписанный кусок инфраструктуры,
то бывает трудно остановиться.</p>
<p>Наебка номер два заключается в формате ключей. Сертификат у нас обычный (ну окей, плюс свой алгоритм), а где же
приватный ключ? Ну вот это вот, которое "----BEGIN PRIVATE KEY----" и много буковок в bas64?</p>
<p>Ключи лежат в зашифрованном контейнер, на контейнер нету спеки. Чисто теоретически, с 2015го года все должно быть
<a class="reference external" href="https://github.com/dstucrypt/jkurwa/blob/master/lib/spec/pbes.js">PBES2/PBKDB</a>, но я в этом году в Украине еще не был и не знаю ситуации на местах. Окей, вы берете иду проу, jda или
кому чего удобней, сами пишете спеку на контейнер, делаете конвертер ключей в стандартный формат, который понимает OpenSSL.</p>
<p>Казалось бы - берем и подписываем. Но не так быстро.</p>
</div>
<div class="section" id="section-4">
<h2>Наебка номер три</h2>
<p>Тривиальщину с форматом подписи, двумя ключами в одном контейнере и всей этой порнографией с LE/BE я оставлю для отдельного
технического поста. Если коротко - PKCS#7 (aka CMS) с указанием своих алгоритмов (как и в сертификате X509), плюс <a class="reference external" href="http://sfs.gov.ua/data/normativ/000/000/63059/un_f_format.doc">враппер</a>
вокруг него с указанием, что <strong>АААА ВНУТРИ ПОДПИСАННЫЙ PKCS#7!!!!!!</strong> и вот это все OpenSSL конечно не прожует. Специальная
библиотека <a class="reference external" href="https://www.npmjs.com/package/jkurwa">jk</a>, прожевать и сгенерировать это может (но не проверяет сам сертификат), специальная библиотека <a class="reference external" href="https://pypi.python.org/pypi/zozol">zozol</a> на пайтоне,
может распарсить и вытащить все интересное, но это по большому счету никого не ебет.</p>
<p>Следующая наебка почти идентична первой - ЭЦП это не то, чем вы пользуетесь или можете сами сгенерировать. ЭЦП - это специальная
юридическая штука, которая возникает в тот момент, когда софт одобренный спецсвязью генерирует <a class="reference external" href="http://dstszi.kmu.gov.ua/dstszi/control/uk/publish/article?showHidden=1&art_id=90096&cat_id=38837">пережеванный PKCS#7</a> <a class="reference external" href="http://sfs.gov.ua/data/normativ/000/000/63059/un_f_format.doc">с врапперами</a>.
Если его генерирует не специально-одобренный софт, то это не ЭЦП, а набор байтиков. Документация, сертификация, статус поставщика
доверенных услуг, заключение о том, что средство защиты информации признано надежным. Ну или покупать за килобакс + месячные отчисления
библиотеку, которая уже это все прошла.</p>
<p>Окей, скажете вы - я прогромист, меня эти крючкотворства не ебут, давайте подпишем, а доказывать будем есичо в суде. По байтикам
же не видно, кто их сегенерировал.</p>
</div>
<div class="section" id="section-5">
<h2>Наебка номер четыре</h2>
<p>Следующая наебка заключается в том, что такой штуки, как электронный подписанный документ на самом деле нет, кроме как в налоговой,
регистрационной службе и специальной фигне для ритейлеров. Например можно взять XML-ку, подписать через <a class="reference external" href="https://github.com/dstucrypt/agent">dstucrypt/agent</a>, послать на почту налоговой и ее там прожует робот. Ну или можно взять RTF документ, который присылает регистрационная служба, закинуть в <a class="reference external" href="https://eusign.org/doc">eusign.org/doc</a> и посмотреть, что да подписано. При этом форматы у первого и второго будут отличаться.</p>
<p>Каким образом заключить контракт, подписать акт выполнения работ и как потом доказывать, что они дейсвительно подписаны - непонятно.
Одно из шикарных объяснений процесса - перед тем, как тащить кого-то за жопу в суд с электронным контрактом, нужно этот электронный контракт отнести в CA, чтобы он дал бумажное заключение, что <em>да подписано, реальне настойщий ЭЦП</em>.</p>
</div>
ЭЦП, смарткарты, алгоритмыhttp://muromec.org.ua/2015/01/idcard2015-01-23T00:00:00ZIlya Petrov<p>Используемые понятия:</p>
<ul class="simple">
<li>алгоритм - пошаговое решение математической задачи, которое может быть воплощено в программном модуле или аппаратном; примеры: RSA, AES, SHA-1, DH, ДСТУ-4145, ГОСТ-28147-89;</li>
<li>секретный ключ - набор данных, известный только владельцу, использующийся в работе алгоритма;</li>
<li>публичный ключ - набор данных, образованный от секретного ключа, распространяемый публично (на визитках, публичных сайтах, справочниках). Получить по публичному ключу приватный невозможно. Одному приватному ключу соответствует один публичный;</li>
<li>подпись - набор данных, появляющийся в результате работы алгоритма и доказывающий, что модулю, реализующему алгоритм, был известен приватный ключ и документ;</li>
<li>проверка подписи - работа алгоритма, использующая публичный ключ, документ и подпись, отвечающая на вопрос "действительно ли алгоритму, создающему подпись, был известен именно этот документ и приватный ключ, соответствующий данному публичному ключу". проверка подписи осуществляется для документа, для сертификата и для метки времени;</li>
<li>центр сертификации — организация чей публичный ключ широко известен и есть доверие, что секретный ключ хорошо защищен, а подписываемые им сертификаты удостоверяют данные реальных субьектов. центр сертификации оказывает услуги по подписанию сертификатов;</li>
<li>сертификат — подписанный центром сертификации документ, содержащий публичный ключ и заверяющий его связь его с неким субъектом (юрлицо, физлицо), либо объектом (штамп, сервер, кошелек);</li>
<li>ЭЦП - набор из подписи, документа и сертификата субъекта, имеющий юридические последствия; так же используется для обозначения набора из секретного ключа и сертификата, связывающего публичный ключ с субъектом права;</li>
<li>общий ключ - одинаковый набор данных, известный двум сторонам некого процесса. Может быть создан одной стороной и передан другой, либо рассчитан двумя сторонами автономно;</li>
<li>смарткарта - аппаратный модуль, содержащий секретный, либо общий ключ и выполняющий алгоритм, использующий этот ключ. Выдает наружу только результат операции, но не ключ. доступ к запуску алгоритма, использующего ключ, может быть защищен пин-кодом;</li>
<li>сим-карта - частный случай смарт-карты, использующий общий с оператором ключ для подтверждения владения телефонным номером;</li>
<li>е-паспорт - частный случай смарт-карты, использующий секретный ключ и связанный с ним сертификат, чтобы подтвердить соответствие личности владельца, как субъекта указанного в сертификате, либо для создания подписи, либо для создания общего с любым другим субъектом ключа;</li>
<li>формат - четко описанное представление данных (ключа, сертификата, документа), необходимое программе или аппаратному модулю для работы алгоритма и представления результата.</li>
</ul>
<div class="section" id="section-2">
<h2>ЭЦП (ключ-сертификат-софт)</h2>
<p>Применяется в некоторых процессах в Украине (интернет-банкинг, регистрация ФОП, сдача налоговой отчетности).</p>
<ul class="simple">
<li>С помощью ЭЦП можно в автоматическом режиме доказать неограниченному кругу лиц, что источником документа в неизменном виде был владелец секретного ключа или кто-либо, имеющий к нему доступ. при правильном поведении сотрудников АЦСК и получателя ключа - это тот же субъект, что записан в сертификате;</li>
<li>С помощью ЭЦП получатель (не подписант) документа может доказать третьим лицам (например суду), что источником документа в неизменном виде был владелец ключа или кто-либо имеющий к нему доступ;</li>
<li>С помощью ЭЦП и временной метки (требует наличия доверенного сервера) можно доказать то же и факт существования документа в определенный момент времени (создан не позднее);</li>
<li>С помощью ЭЦП можно зашифровать файл таким образом, что расшифровать его сможет только владелец определенного приватного ключа (определенный субъект);</li>
<li>С помощью ЭЦП можно доказать свою личность любому отдельному субъекту из широкого круга;</li>
</ul>
<p>Данные задачи решаются в случае если все субъекты взаимодействия имеют доступ к программным или аппаратным средствам, поддерживающим алгоритмы и форматы друг-друга и данный процесс признается государством, как участником данного процесса.</p>
<p>В данный момент в Украине сложилась ситуация, когда:</p>
<ul class="simple">
<li>широкий круг лиц не имеет доступа к таким программным средствам;</li>
<li>широкодоступные средства, реализующие популярные алгоритмы не признаются;</li>
<li>отсутствует какой-либо формат документов;</li>
<li>сами документы существуют только внутри какой-либо системы;</li>
<li>производителями таких систем являются сертификационные центры;</li>
<li>не существует общедоступной системы для обмена, регистрации или легализации документов ни построенной на национальных, ни на мировых стандартах;</li>
</ul>
</div>
<div class="section" id="rsa-vs-4145">
<h2>RSA vs ДСТУ4145</h2>
<p>Вопрос противопоставления RSA и ДСТУ 4145 (и сопутствующих ГОСТов) в контексте аутентификации и идентификации задевает одно звено описанной выше проблемы - широкую доступность средств криптографии и возможность выхода большего количества производителей на рынок. Остальные аспекты данной проблемы должны быть решены независимо от используемого стандарта. В частности совместимость форматов может проверяться стендом, а создание (или лицензирование) общедоступной системы (или стандарта обмена для систем) будет требоваться в любом случае.</p>
<p>Проблемы широкой доступности средств криптографии (а скорее конечных продуктов) могут быть решены без смены стандарта (но с возможностью перейти на RSA или другой перспективный алгоритм впоследствии). Например возможно:</p>
<p>выкупить или создать криптобиблиотеку стандарта ДСТУ 4145, провести ее сертификацию и опубликовать для свободного использования;
лицензировать библиотеку и создать общедоступный сервисы аутентификации (далее портал) и сервис обмена документами, как объекты цифровой инфраструктуры для внутреннего использования в госорганах и как сервис для бизнеса;</p>
<p>Одним из действительных преимуществ RSA или ECDSA является его поддержка браузерами в виде сертификатов и виде Web Crypto API (<a class="reference external" href="http://www.w3.org/2012/webcrypto/webcrypto-next-workshop/papers/Using_the_W3C_WebCrypto_API_for_Document_Signing.html">http://www.w3.org/2012/webcrypto/webcrypto-next-workshop/papers/Using_the_W3C_WebCrypto_API_for_Document_Signing.html</a>). При использовании RSA-сертификатов, аутентификацию (но не подписание документов) можно выносить на канальный уровень (SSL aka TLS aka HTTPS), где она тривиально настраивается в конфигурации веб-сервера, а подписание реализовывать средствами Web Crypto API браузера.</p>
</div>
<div class="section" id="section-3">
<h2>Ограничения и предположения</h2>
<p>При использовании ЭЦП все субъекты полагаются на то (доверяют), что каждый АЦСК сертифицирует ключи только тем субъектам, личность которых записывает в сертификат, а владелец ключа не разглашает его или разглашает только лицам, которых уполномочивает выступать от своего имени (например бухгалтеру).</p>
</div>
<div class="section" id="section-4">
<h2>Выдача текстового пароля</h2>
<p>Выдача текстового пароля через ЦНАПы или другие органы власти может решить проблему идентификации субъекта онлайн без применения ЭЦП и необходимости использовать сертифицированные средства криптографической защиты.</p>
<p>Текстовые пароли используются для доступа к большинству ресурсов в интернете, включая интернет-банкинг для физлиц в Украине. В некоторых ситуациях используется два пароля (двухфакторная авторизация, например пароль+код из смс).</p>
<ul class="simple">
<li>пароль позволяет доказать сервису, выдавшему пароль, что субъект обращающийся к сервису в какой-то момент времени имел доступ к пин-конверту или знает текст пароля. при правильном поведении оператора и получателя конверта - это тот же субъект, что и получатель пин-конверта;</li>
<li>при онлайн-доступе, такое доказательство может быть проверено порталом авторизации с выдачей токена подтверждения для широкого круга сервисов, доверяющих порталу в процедуре аутентификации;</li>
<li>портал, проверяющий пароль, не может доказать личность пользователя третьим лицам иначе, чем административно;</li>
<li>пароль не может использоваться для прямого доказательства своей личности широкому кругу субъектов;</li>
<li>пароль не может использоваться для доказательства неизменности документа или времени его создания;</li>
</ul>
<p>Процедура выдачи пароля может быть основана на пин-конвертах, используемых в банковской сфере. Оператор, проверяет личность человека, желающего получить конверт, записывает проверенную идентичность в систему аккаунтов вместе с номером пин-конверта, который портал может связать с самим паролем.</p>
<p>При использовании пароля все субъекты полагаются на то, что портал аутентификации корректно проверяет пароль, а операторы корректно проверяют личность при выдаче пин-конверта;</p>
<p>Аутентификация по смс (one time password) является разновидностью аутентификации по паролю, обладает теми же свойствами и может ее дополнять. Дополнительная гарантия - смс могут приходить только на один телефон и их нельзя заранее скопировать, как пароль. Для использования аутентификации по смс-паролю, оператор должен вместо (или вместе с) выдачей пин-конверта проверить и записать номер телефона идентифицируемого лица.</p>
<p>Портал может комбинировать разные способы аутентификации (пароль, otp, ЭЦП) не требуя внедрения ЭЦП на каждом использующем его сервисе. Это поможет плавно перейти от простого (выдача конвертов) к сложному (ЭЦП) и одновременно сэкономить на лицензиях, не лицензируя криптобиблиотеку для каждого отдельного ресурса. При этом портал будет использовать ЭЦП только для подтверждения личности, но не для подписи документов, шифрования и прочего. Для такой схемы достаточно шифрования с общим ключем и выдачи нумерованных смарт-карт, как более безопасного аналога пин-конвертов.</p>
</div>
<div class="section" id="section-5">
<h2>Смарт-карта</h2>
<p>Смарта-карта, содержащая приватный ключ и сертификат может выдаваться, как отдельное устройство, может быть совмещена с сим-картой телефона или может быть встроена в паспорт.</p>
<p>Использование смарт-карты, реализующей ЭЦП, позволяет решить все те же задачи, что ЭЦП как таковое, но при это дополнительно защищает владельца ключа от несанкционированного доступа к нему.</p>
<p>Встраивание смарт-карты в паспорт позволяет государству ограничить передачу ключа третьим лицам с санкции или без санкции владельца. Чтобы эта гарантия работала, нужно так же запретить использование ключей не встроенных в паспорт, то есть организовать государственную монополию на ЭЦП.</p>
</div>
Деплоймент пайтон кодаhttp://muromec.org.ua/2014/08/deployment2014-08-14T00:00:00ZIlya Petrov<p>Вот например у нас сейчас есть такой сайт eusign.org. Про сайт я конечно тоже напомню, чтобы все знали, какую крутую штуку мы сейчас делаем.</p>
<p>Делаем мы веб-приложение, чтобы создавать, подписывать и пересылать электронные документы. ДСТУ 4145-2002, Гостовые шифры, OAuth2, PKCS#7 и маркдаун. Хардкор вобщем.</p>
<p>Чтобы весь этот хардкор работал, нужно мешок серверных зависимостей, сишные модули к ним, какой-то всякий жаваскрипт, собирающийся браузерифи, статические файлы, менеджащиеся бовером, переводы еще. Надо же как-то суржик поддерживать и инглиш.</p>
<div class="section" id="section-2">
<h2>Суть проблемы</h2>
<p>Сам по себе пайтон код деплоится очень просто. Закинул в каталог, выдал пинка через сигнал контейнер демону и все - новый код уже сервится. Заливать можно хоть через rsync, хоть через git, хоть тарболы по scp гонять.</p>
<p>Но вот у кода есть куча зависимостей, у зависимостей есть сишные расширения и уже на сервер притащили gcc, девелопмент пакеты от пайтона и постргреса. Мне такое не нравится конечно, но пока весь треш и праздник рубизма происходит в virtualenv - это еще ладно.</p>
<p>Но тут приходит Мойша и вот на сервере уже нужно сразу мешок всего - руби, ноду, бовер, лесс, процессить файлы локализации. NYET NYEVOZMOZHNO.</p>
</div>
<div class="section" id="codeship">
<h2>Codeship</h2>
<p>Пришлось садиться и делать красиво. Репозиторий подцепляется к кодшипу, там запускается make setup и все скомпиленные статические файлы в готовом виде улетают на сервер рсинком.</p>
<p>Но не тут-то было. Виртуаленв, в отличии от статических файлов, нельзя просто так взять и перетащить с одной машины на другую. Все ломался, пути не совпадают, версии библиотек, архитектура.</p>
<p>А счастье было так близко.</p>
</div>
<div class="section" id="ubuntu-ppa">
<h2>Ubuntu PPA</h2>
<p>В итоге проблему пришлось решать по хардкору - поставить все пайтоновые зависимости в virtualenv, зафризить список и по нему скачать из чизишопа все что нужно.</p>
<p>Дальше по этому пройтись шикарной утилитой stdeb и получить пакеты, пригодные для аплоада в PPA.</p>
<p>Вот как-то так для каждого:</p>
<pre class="literal-block">
python setup.py --command-packages=stdeb.command sdist_dsc -z trusty
debsign ./deb_dist/${fname}.changes -k$GPGKEY
dput ppa:ilya-muromec/python ./deb_dist/${fname}.changes
</pre>
<p>Ну для некоторых пришлось подкрутить чего, чтобы не было глитчей, типа <cite>python-python-social-auth</cite>, несовпадений с уже существующим пакетами и всего такого.</p>
<p>После нескольких неудачных попыток, необходимый набор зависимостей с нужными версиями висел на ланчпаде и красиво ставился на сервере через apt-get. Моего уровня правда не хватило на метапакет, но уже неплохо.</p>
</div>
<div class="section" id="section-3">
<h2>Результат</h2>
<p>В итоге процедура получилась такая:</p>
<ul class="simple">
<li>свой пайтоновый код живет в репозитории и ставится из него же</li>
<li>ништяки, типа секрета для кук и конекнеша к базе в репозе не лежат, а лежат в локальном файле</li>
<li>все зависимости, которые нужны для работы сервера (не для сборки), ставятся заранее через apt-get</li>
<li>сборка статических файлов проходит на кодшипе - весь less, browsefiry, babel и bower вместе с нодой и рубями ставится туда и запускается там, а результирующий набор кода, файлов, переводов прилетает на рабочий сервер через rsync</li>
<li>финальным аккордом запускается миграция и пинок контейнеру, чтобы обновил код</li>
</ul>
</div>
Сигнербоксhttp://muromec.org.ua/2014/07/eusign2014-07-12T00:00:00ZIlya Petrov<p>Сигнербокс - это такое веб-приложение, которое позволяет подписывать данные и аутентифицироваться в браузере через цифровой сертификат, удостоверяющий личность.</p>
<p>К клиентскому сигнербоксу прилагается серверный демон, который подписи проверяет
и выдает результат. Демон называется dstud. Готовая сборка лежит в <tt class="docutils literal"><span class="pre">ppa:ilya-muromec/dstud</span></tt>.</p>
<p>Сам сигнербокс хостится на домене eusign.org и работает по OAuth-like протоколу - получает запрос при переходе на страницу, показывает пользователю предложение авторизировать запрос и перебрасывает на обратно с готовым результатом.</p>
<div class="section" id="section-2">
<h2>Интеграция</h2>
<p>Чтобы добавить проверку личности с помощью signerbox/dstud на сайт, нужно:</p>
<ul>
<li><p class="first">установить на своем хосте dstud-static из ppa:</p>
<pre class="literal-block">
add-apt-repository ppa:ilya-muromec/dstud
apt-get update
apt-get install dstud-static
</pre>
</li>
<li><p class="first">зарегистрировать свое приложение по адресу <a class="reference external" href="https://eusign.org/register_app">https://eusign.org/register_app</a> и получить app_id.</p>
</li>
<li><p class="first">установить интеграционный плагин для своего сайта или написать новый</p>
</li>
<li><p class="first">указать в настройках плагина полученый app_id</p>
</li>
</ul>
</div>
<div class="section" id="section-3">
<h2>Вордпресс</h2>
<p>Сейчас у меня есть готовый плагин для ворпдесса, он живет по адресу <a class="reference external" href="https://github.com/themao/dstu-login">https://github.com/themao/dstu-login</a> . При регистрации приложения, нужно указать <tt class="docutils literal">auth_url</tt> в виде <tt class="docutils literal"><span class="pre">https://:domain/wp-login.php</span></tt>. Принимаются только адреса со схемой https.</p>
<p>После того, как плагин настроен, на странице входа должна появится ссылка "Sign with eU".</p>
<p>Живое демо доступно по адресу <a class="reference external" href="https://dstu.enodev.org">https://dstu.enodev.org</a>.</p>
<p>В разработке плагина принял участи <a class="reference external" href="https://twitter.com/niggaslife">@niggaslife</a></p>
</div>
<div class="section" id="section-4">
<h2>Как это работает</h2>
<p>Сигнербокс запрашивает у пользователя доступ к приватному ключу и сертификату,
после чего подписывает строку, содержащую доменное имя сайта и нонс и передает
сайту полученную подпись, сертификат и нонс для проверки.</p>
<p>При этом приватный ключ пользователя не покидает броузер и не передается по сети,
а сайту, интегрирующемося с сигнербоксом, нет необходимости доверять полученным данным,
поскольку все проверки выполняются внутри <tt class="docutils literal">dstud</tt>, установленном у него на хосте.</p>
</div>
<div class="section" id="section-5">
<h2>Насколько это безопасно</h2>
<p>Сигнербокс не хранит ключи или пароли пользователей на сервере и использует HTTPS для
передачи страницы и скриптов в браузер. При этом все же остается вектор атаки - если
кто-то взломает сервер и подменит скрипты на нем.</p>
<p>Чтобы защититься от этой возможной проблемы, в будущем будет добавлена возможность
работы с ключем через мобильное приложение.</p>
</div>
<div class="section" id="section-6">
<h2>Сертификация</h2>
<p>По закону Украины об электронной подписи, юридически значимой является подпись,
сделанная сертифицированным или прошедшим экспертизу ПО. Сигнербокс и используемые
библиотеки не проходили сертификацию или экспертизу, поэтому, в случае судебного
разбирательства вы можете иметь проблесы с тем, чтобы доказать связь между
пользователем и личностью. Если вам это важно - помогите проекту пройти сертификацию
или проконсультируйтесь с юристами.</p>
</div>
<div class="section" id="section-7">
<h2>Разработка плагинов</h2>
<p>Написать свой интеграционный плагин достаточно просто. Для этого нужно сделать такие вещи:</p>
<ul class="simple">
<li>в форме входа показывать ссылку на <tt class="docutils literal"><span class="pre">https://eusign.org/auth/:app_id?state=:app_state</span></tt></li>
<li>добавить обработчик auth url, который считывает GET парметры sign, nonce, cert_id</li>
<li>скачать сертификат по адресу <tt class="docutils literal"><span class="pre">https://eusign.org/api/1/certificates/:cert_id</span></tt></li>
<li>сформировать параметр <tt class="docutils literal">data</tt> формата <tt class="docutils literal"><span class="pre">:nonce|:auth_url</span></tt></li>
<li>отправить POST запрос на адрес <tt class="docutils literal"><span class="pre">http://localhost:8013/api/0/check</span></tt> с параметрами <tt class="docutils literal">c</tt> (полученный сертификат), <tt class="docutils literal">d</tt> (параметр data) и <tt class="docutils literal">s</tt> (параметр sign).</li>
<li>при ответе 200 OK, распарсить результат, как набор строк key=value и создать пользователя, либо найти существующего</li>
</ul>
<p>Поле <tt class="docutils literal">1.2.804.2.1.1.1.11.1.4.1.1</tt> будет содержать уникальный идентификатор пользователя (ИНН). Поскольку данное поле содержит определнную информацию о пользователе, а не является синтетическим идентифиатором, рекуомендуется использовать его не в чистом виде, а хеш с солью от него.</p>
<p>Содержимое параметра <tt class="docutils literal">state</tt>, указанного при аутентификации, может быть произвольным и возвращается без изменений обратно в <tt class="docutils literal">auth_url</tt>. Рекомендуется указывать в нем одноразовый токен для защиты от CSRF.</p>
</div>
<div class="section" id="section-8">
<h2>Тестовые сертификаты</h2>
<p>Для удобства разработки, вместе с демоном dstud распостраняются тестовый сертификат и ключ (<tt class="docutils literal">user.cer</tt> и <tt class="docutils literal">user.key</tt>). Чтобы разрешить вход по тестовому сертификату, нехобходимо остановить демон <tt class="docutils literal">dstud</tt> и запустить его из каталога <tt class="docutils literal">testCA</tt>.</p>
<p>Тестовый сертификат не содержит поля <tt class="docutils literal">1.2.804.2.1.1.1.11.1.4.1.1</tt>.</p>
</div>
Войнаhttp://muromec.org.ua/2014/06/war2014-06-07T00:00:00ZIlya Petrov<p>Сейчас у меня тут в Украине происходит война. Война - это смерти, разрушение привычного уклада жизни, случайные и намеренные разрушения, переезды, нервы, неудобства.</p>
<p>Помню свое ощущение, когда в каких-то еще девяностых была война в Чечне. Вроде как и война, а вроде и просто картинки по телевизору. То есть вот там рядом война, а ты себе живешь, как жил и ничего не меняется. Такое же странное ощущение было, когда я заканчивал школу, а Киеве происходил майдан, который тогда не писался с большой буквы - вроде и революция, а никаких внешний проявлений вообще. Продолжаешь делать все что делал и все вокруг такое же самое.</p>
<div class="section" id="section-2">
<h2>Картинка</h2>
<p>Логически я вполне осознаю, что в Донецкой области натуральный замес, там убивают людей, фигачат пулеметы, "работает" авиация и через границу, как к себе домой ездят грузовики с казаками-чеченцами или вообще непонятно кем. А в сфере непосредтственных ощущений - почти ничего. Уже привычные сводки на телеящике в кафе "атака на блокпоста, бла-бла-бла, авианалет, уничтоежено бла-бла-бла, столько-то убитый, столько-то раненых". И все, и никто особо не обращает внимание. В феврале, когда в Киеве происходил Майдан, все в общественных местах адски залипали в телевизоры, ловили каждое слово. Вся инфорамция была по делу, была важной и касалась тебя лично. А сейчас нет.</p>
</div>
<div class="section" id="section-3">
<h2>Оружие и форма</h2>
<p>Странные внешние проявления - гайцы и милициянты (у меня тут рядом райотдел) менее расслабленные и, уже как правило при калашах и брониках. Стоит прям на улице возле входа, дежурит чтоле. С калашем. Гайцы в Одессе просто возле дороги на обычной гайцовой машине - при калашах. Самое интересно, что это не вызывает тревоги и ощущения опасности, а скорее успокаивает.</p>
<p>На улице стало больше людей в форме и ты на них смотришь. Ну или не больше, а просто их стал замечать. Молодежь в основном и такое ощущение, что они этим понтуются. Ловят момент, когда обществу не пофиг на их статус. Если солдаты, которых видел раньше - они какие-то закошмаренные и обиженные жизнью были, то тут или воспряли духом или просто другие. Подозреваю конечно, что настоящие солдаты щас по ноздри в делах и на стреме, а это всякая учебка и курсанты понты колотят.</p>
<p>На трассе Одесса-Киев, когда ехал в конце мая, видел блокпосты. В чем их функциональное назначение так и не понял - какие-то загородки из мешков, бетонные блоки, с надписями "Слава Україне". Чтобы прям сидели и за чем-то следили - не заметил. Никого конечно не останавливают, просто присутствуют. Видимо на тот случай, если по дороге прикатятся какие-то артисты и будут что-то захвытывать сами.</p>
<p>Хорошо, если правительство разрулит ситуацию с армией, еще лучше, если легулизуют оружие и частные батальоны.</p>
</div>
<div class="section" id="section-4">
<h2>Информация</h2>
<p>Что происходит на самом деле в Луганской и Донецкой - не особо понятно. То-ли факты, то-ли пропаганда отрывочны и тенденциозны. Относительно понятный момент - где-то вокруг или возле Славянска воюют натурально и сам город не контродируется. Что происходит на всей остальной территории обоих областей - абсолютно не понятно для меня.</p>
<p>Еще понятно, что рано или поздно этих вояк перестреляют, если конечно из России не отправят натуральную армию с бтрами, танками и зенитками, а не камазы с пехотой.</p>
<p>Кто эти вояки, сколько среди них местных, сколько чеченцев, сколько росийских диверсантов или просто криминалитета с бывшими ментами - решительно непонятно. Понятно, что в начале истории были реальные диверсанты, скорее всего росийские. Кто оплачивает камазы с наеминиками - можно строить версии, но явный факт - с той стороны границы их исправно пропускают.</p>
</div>
<div class="section" id="section-5">
<h2>Остальное</h2>
<p>Очень конечно радует, что в Одессе этого не происходит. За людей в Луганской и Донецкой хочется, чтобы понменьше попало под пули и чтобы не взрывали потом, когда перейдет в вялотекущую фазу.</p>
<p>Не хочется, чтобы это была бесконечная войнушка или еще одна оккупировання территория - ни в виде Приднестровья, ни как захваченная Россией.</p>
<p>Совсем не хочется, чтобы под предлогом борьбы и войны устроили Раша-стайл диктатуру с гебней, рамками-детекторами везде и произвольно-бессмысленными запретами и неудобствами. Путин начинался именно с борьбы с "террористами" в Чечне, а сидит до сих пор. Это меня волнует даже больше состояния дел на в "тех" двух областях. Области теряет государство, а гражданские свободы - лично я.</p>
<p>Отдельно радует, что поотключали рашинские каналы и вообще стала замечаться разница между "тут и там". Ну и что все показушные борцун-националисты резко девальвировались. На словах Степан Бандера, а на деле - кококо.</p>
</div>
Схема Діффі-Геллманаhttp://muromec.org.ua/2014/06/dhkdf2014-06-01T19:30:00ZIlya Petrov<p>Для начала напомню некоторые банальноести.</p>
<p>Шифрование бывает симметричное и асимметричное. Симметричное шифрование - это AES или GOST 28147-89. У нас есть заранее известный алгоритм, который описан стандартнами, есть данные, которые мы хотим зашифровать и есть ключ. Мы засовыеем данные и ключ в алгоритм и получаем зашифрованные данные.</p>
<p>Теперь, чтобы получить обратно расшифрованные данные, нам нужно засунуть их и <em>тот же самый</em> ключ обратно в алгоритм. То есть, при передаче данных от одного человека другому по шифрованному каналу, оба должны <em>заранее</em> знать ключ, которым они шифруются. Наивный подход заключается в том, что стороны обмениваются ключем непосредственно, после чего осуществляют передачу данных.</p>
<p>Проблема у такого подхода заключается в том, что одни и те же данные, зашифрованные одним и тем же ключем будут давать одинаковый шифротекст, а значит злоумышленник, сидящий на канале будет как минимум знать, что сообщение повторили. Намного хуже, если одним и тем же ключем шифруются похожие, но не одинаковые данные. Так можно спалить и данные и даже ключ.</p>
<div class="section" id="kdf">
<h2>KDF</h2>
<p>Чтобы решить вторую проблему, используют KDF - key deriviation function. В данном случае стороны заранее договариваются об <em>общем секрете</em>, а уже из секрета по некой схеме получают ключи, различающиеся для разных сеансов обмена данными.</p>
<p>В качестве KDF может использоваться геш-функция. Например, у нас есть общий секрет Z, о котором мы заранее договорились. Мы берем этот секрет и случайную последовательность данных (соль) и засовываем на вход геш-функции: <tt class="docutils literal">`HASH(Z + salt)`</tt>. На выходе получим свои 32 байта данных, которые уже будут использоваться в качестве ключа, которым мы шифруем данные. Теперь мы передаем другой стороне шифрованные данные и соль. На той стороне таким же самым образом из общего секрета и соли получает ключ, которым расшифровывают данные.</p>
</div>
<div class="section" id="key-wrap">
<h2>Key wrap</h2>
<p>Следующая стадия - использование случайных ключей. Чтобы еще лучше защититься, мы не используем KDF и общий секрет для получения ключа шифрования данных (CEK). Вместо этого мы генерируем случайный ключ, шифруем данные им, после чего используем KDF и общий секрет, чтобы сгенерировать ключ шифрования ключа (KEK). Этоим ключем мы шифруем наш случайный ключ, которым зашифровали данные и передаем другой стороне шифротекст, зашифрованнй случайный ключ (wCEK) и соль для KDF.</p>
</div>
<div class="section" id="section-2">
<h2>Діффі-Геллман</h2>
<p>Вот тут на арену выходит Діффі-Геллман и ассиметричное шифрование на эллиптичных кривых.</p>
<p>Теперь у нас нету общего секрета, но есть по паре ключей - приватному и публичному (privA, pubA). У другой стороны, которой мы отправляем данные, тоже есть пара ключей (privB, pubB) и мы имеем сертификат, в котором указан pubB.</p>
<p>В случае эллиптичных кривых, приватный ключ - это одно длинное <em>число</em>, а публичный - это <em>координаты точки</em> на кривой, которые мы генерируем, умножая базовую точку кривой (которая известна всем) на свой приватный ключ умноженный на единицу (pub = curve.base * priv * -1).</p>
<p>Дальше мы делаем совершенно тривиальный фокус - умножаем <em>свой</em> приватный ключ на <em>чужой</em> публичный. Фактически мы получаем результат умножения своего приватного ключа на чужой приватный ключ (privA * privB * curve.base * -1), хотя чужой приватный ключ не знаем. Принимающая сторона делает ровно то же самое - умножает <em>свой</em> приватный ключ на <em>наш</em> публичный. Результат конечно же совпадает, хотя мы предварительно не обменивались никакой секретной информацией. Чтобы нигде не закрылся злой мудак, все домноживаем на кофактор - например 4.</p>
<p>Тепер по уже накатанной схеме - координату X полученной точки мы используем, как общий секрет, из общего секрета и соли получаем KEK, ключем KEK врапаем рандомный ключ CEK, врапнутый ключ, зашифрованные им данные и соль отправляем получателю.</p>
</div>
<div class="section" id="pkcs-7">
<h2>PKCS #7</h2>
<p>А чтобы передать эту кучу информации, мы ее пакуем в ASN.1 структуру, схема которой называется PKCS #7. Структура жирная, развесистая, включает вообще все - и шифротекст, и ключ, и соль, и сало, и параметры алгоритмов с идентификаторами и собственно сертификат, из которого взять публичный ключ.</p>
<p>Самое интересно, что я сходу очень быстро заимплементил все вышеописанное, но криво считал публичный ключ из сертификата, перепутав в одном месте плюс и xor, поэтому у меня очень долго все работало криво и выдавало "key unwrap failed".</p>
</div>
JShttp://muromec.org.ua/2014/06/js2014-06-01T00:00:00ZIlya Petrov<p>Я тут делаю интересную штуку, работающую с национальной криптографией.
Гост-шифр, гостовая геш-функція, эллиптические кривые, вот это вот все.</p>
<p>Изначально проект задумывался, как интеграционный - взять готовые решения,
собрать воедино, приделать немного интерфейсного кода и получится круто.
В итоге из готового я взял только библиотеку больших чисел и блочный шифр с хешем, которые написаны на C. Схемы ASN.1 объектов, библиотеку для работы с эллиптическими кривыми на поле Галуа и протокол Діффі-Геллмана пришлить делать самому. Интерфейс конечно тоже пришлось, а делать интерфейсы я не люблю.</p>
<p>Основная трудность - это конечно не dhSinglePass-cofactorDH-gost34311kdf-scheme, на который есть спека и юниттесты на сайте державной службы спецсвязи, а то, что все делается на лошадо-рептилоидном броузерном <a class="reference external" href="http://media0.giphy.com/media/GYU7rBEQtBGfe/original.gif">жаваскрипте</a>;</p>
<div class="section" id="section-2">
<h2>В чем вообще проблема?</h2>
<p>Моя основная проблема с жаваскриптом всегда была в том, что мне непонятно,
как его распиливать на модули. Все эти фокусы с автоматическим приведением херни к строке и тем, что undefined больше или меньше какого-то числа меня особо не парят при наличии юнитестов и линтера.</p>
<p>Модульность в жаваскрипте традиционно делалась или никак или через жопу с асинхронными коллбеками. Как работает r.js и вот эти все динамические лоадеры я не мог разобраться ровно столько раз, сколько пытался.</p>
<img alt="imports.png" src="imports.png" />
<p>Мне хотелось получить очень простую штуку - разложить код по разным файлам и явно импортить символы из одного в другой, после чего набирать ровно одну команду, которая будет это все собирать в самодостаточный скрипт, который можно повесить в единственный тег "script src" в хедере страницы.</p>
<p>Отдельный бонус - это установка готовых пакетов стандартной командой и последуюющее обращение к ним из своего кода таким же образом.</p>
</div>
<div class="section" id="section-3">
<h2>К чему я пришел</h2>
<p>В итоге я получил ровно то, что хотел. Код распиливается на модули, в начале каждого файла висит список импортов через нодовский require(), после чего вся эта солянка пакуется в самодостаточный файл консольной тулзой browserify, прописанной в мейкфайле. Что вдвойне прекрасно - в каждом файле присутствует явный список экспортируемых переменных, то есть все на виду.</p>
<p>Отдельные куски кода при этом выносятся в собственые репозитарии и ставятся через npm так же, как и стандартные библиотеки, вроде cookies-js.</p>
</div>
<div class="section" id="emscripten">
<h2>Emscripten</h2>
<p>Все работает настолько круто, что таким способом пакуется даже сишный код, странслированный через emscripten, хотя для этого нужно дописываеть одну строчку через --post--js и отключать парсинг файла в браузерифи через --noparse.</p>
</div>
<div class="section" id="section-4">
<h2>Где на это посмотреть</h2>
<p>Посмотреть можно на живом коде <a class="reference external" href="https://github.com/muromec/dstukeys">dstukeys</a> и его зависимостях - <a class="reference external" href="https://github.com/muromec/jkurwa">jkurwa</a> и <a class="reference external" href="https://github.com/muromec/em-gost">em-gost</a>. Устанавливается и пакуется все одним мейкфайлом в репозе dstukeys.</p>
</div>
ДСТУ-4145http://muromec.org.ua/2014/05/dstu2014-05-15T00:00:00ZIlya Petrov<p>Пока у нас тут происходит война с русо-фашисто, движение криптонепротивления
не собирается сворачивать манатки. В этот раз я решил взяться за цифровую
подпись и эллиптические кривые. Криптографией и Правым Сектором можно добиться
даже больше, чем просто Правым Сектором. Редакция бложика просит перед прочтением
данного текста убрать от экрана москалей, математиков и людей, у которых бомбит от слов
"<strong>ГЕШ ФУНКЦІЯ</strong>" и "<strong>БЛОЧНЫЙ ШИФЕР</strong>".</p>
<img alt="http://i.imgur.com/x98bGrA.jpg" src="http://i.imgur.com/x98bGrA.jpg" />
<div class="section" id="section-2">
<h2>Шо такое эллиптические кривые?</h2>
<p>Для начала краткий ликбез по поводу того, что же такое эллиптические кривые,
зачем их придумали и как с этим жить. У мейнстримовых алгоритом шифрования
есть два главных вража - паяльник и факторизация. Фактически, очень много
всего, например RSA, держится на несколько наивном допущении, что можно
взять два оче длинных простых (делящихся только на себя - 7, 19, 13) числа,
умножит одно на другое, рассказать всему интернету результат, то при этом
никто не догадается, какие именно числа умножали.</p>
<p>Если догадаться может, а добрые дяди математики спят, чтобы сделать такую бяку,
то все приватные ключи резко становятся достоянием общественности и вместо
криптоанархии мы получаем криптоапокалипсис.</p>
<p>Но поскольку у математиков, кроме тяги к тому, чтобы все сломать, есть
еще замечательная привычка придумывать абсолютно несвязанные с реальностью,
но внутренне непротиворечивые абстракции, они придумали новый фокус.
Если обычные числа уязвимы для факторизации, значит надо придумать какую-то
особенную херню, которую можно умножать, складывать и брать модуль от деления
по каким-то своим правилам. Ну и придумали, что можно нарисовать кривую,
зафигачить на ней точки и складывать эти точки друг с другом. Оттуда уже
вывели умножение и все остальное.</p>
</div>
<div class="section" id="section-3">
<h2>ДСТУ</h2>
<p>Занялся я тем, что взял свои ключи, выданные в налоговой и стал ковырять их формат.
Собственно ключем является одно 256-битное число. Кроме него есть еще параметры уравнения,
которые задают кривую, координаты базовой точки и размер поля. Все эти параметры стандарты
и их вариации даны в табличках <a class="reference external" href="http://info-stand.com/downloads/dstu/dstu-4145-2002/dstu-4145-2002.pdf">державного стандарта</a>.</p>
<p>Некоторая неприятность заключалась в том, что контейнер, в котором хранится это число вместе
с параметрами выбранной кривой - зашифрованный блоб нестандартного вида. Блоб пришлось разламывать
и получилась тулза для <a class="reference external" href="http://dstu.enodev.org/">расшифровки контейнеров</a>. В процессе расковыривания, заковыривания и
програмирования тулзы - познакомился с крутой технологией <a class="reference external" href="https://github.com/kripken/emscripten">emscripten</a>. Работает вообще замечательно.
Взял два файла из OpenSSL, скомпилировал с третьим, который сам <a class="reference external" href="https://github.com/muromec/dstukeys/blob/master/source/iit.c">написал</a> и получил готовый
кусок кода, который расшифровывает ключи прямо в браузере. По ходу дела - еще и с ASN.1 разобрался,
давно на радаре мелкало.</p>
</div>
<div class="section" id="section-4">
<h2>Алгоритмы</h2>
<p>На самом деле ДСТУ - это сразу несколько криптоалгоритмов:</p>
<ul class="simple">
<li>Сначала мы берем свою специальную хеш-функцию ДСТУ-34.311-95 и с ее
помощью делаем из пароля с солью ключ.</li>
<li>Если контейнер сделан на правильном стандарте, а не кустарном, то вместо хеш-функции используем MAC ГОСТ 28147</li>
<li>Потом берем блочный шифер ДСТУ 28147-89 и полученным ключем расшифровываем контейнер.</li>
<li>Уже из контейнера достаем заветное секретное число, которое используется, как приватный ключ для ДСТУ 4145-2002 чтобы сделать подпись</li>
</ul>
<p>По сути первые два стандарта - это уже готовые и реализованные в OpenSSL и BounceCaste ГОСТы, только с другими S-BOX (таблицами замен).</p>
</div>
<div class="section" id="section-5">
<h2>Кто все эти люди?</h2>
<p>Блочный шифер - это штука очень простая. Есть два Васи, у каждого из которых имеется одинаковая секретная строчка. Потом первый Вася пишет какой-нибудь документ, шифрует блочным шифером и получает документ такого же самого размера, но шифрованный. Дальше второй Вася может таким же самым ключем расшифровать этот документ.</p>
<p>Хеш-функция - это тоже все знают. Вася берет свой документ какого угодно размера, прогоняет через хеш-функцию и получает строчку фиксированной доины (32 байта, например).</p>
<p>А вот последний шаг - это уже для подписи и ассиметричного шифрования. Получаем пару циферок - одну оставляем себе, вторую раздаем всем. Ну и той, которую оставили себе - подписываем что надо, а все кто знает вторую (публичную) могут точно узнать, что человек поставивший подпись знает первое число.</p>
<p>Сертификат - это подписанный каким-то центральным авторити файлик, в котором указано мое имя и публичная часть ключа. Что-то типа личной печати, которая является еще и паспортом.</p>
</div>
<div class="section" id="section-6">
<h2>Что я сделал</h2>
<p>Пока что я научился читать параметры из запароленного контейнера и сделал себе на пайтоне код, который может, зная эти параметры, сгенерировать подпись к нужному файлу, проверить ее же или сгенерить новую пару ключей. Это ни разу не полноценный PKI конечно. <a class="reference external" href="https://github.com/muromec/ukurwa4145">Посмотреть можно тут</a></p>
<p>Часть, которая умеет читать сертификаты, проверять их корректность и проверять соответствие подписи какому-то субъекту - этого все пока что только в <a class="reference external" href="http://www.crypto.org.ua/">патченом openssl</a>.</p>
</div>
<div class="section" id="section-7">
<h2>Что получится в результате</h2>
<p>В результате будет библиотека для браузера и консольная тулза для проверки и удостоверения собственной аутентичности. Сейчас это делают очень стремно - через подгрузку жава-апплета, что меня дико бесит.</p>
<p>Самое хорошее - такая подпись удостоверена государство и им же признается. В теории можно будет нажимать в браузере кнопочку вместо автографов на бумажка, но это вопрос внедрения, документооборота и всего такого вплоть до голосования на выборах.</p>
</div>
Львовhttp://muromec.org.ua/2014/04/lviv2014-04-23T00:00:00ZIlya Petrov<p>В связи с всякими разными событиями, с февраля нахожусь во Львове. Причины банальны - тут дешевле и безопаснее. В Одессе нужно было бы все время сидеть на стреме, что или голову какие-то рашисты разобьют или танки советские приедут. Тем более, что рынок аренды недвижки в Одессе нездоров.</p>
<div class="section" id="section-2">
<h2>Город</h2>
<p>От Одессы и Киева Львов отличается тем, что это именно город, как социальное явление, а не просто набор домов. Тут есть ратуша, тут есть мер, который ходит по улице и выступает с обращениями. Тут сам город какой-то более живой и говорящий.</p>
<p>Особенно заметно это было во время февральских событий. Когда на Майдане был апогей событий, все поситители и работники кафешек втыкали в телевизоры. Там были трансляции с Майдана и актуальное обращение мера по поводу.</p>
<p>В какой-то момент по западным областям прошлась волна антиментовского насилия (ака "ночь гнева"). Во Львове я застал происходящее вживую - возле ментовки и прокуратуры было достаточно весело. Баррикады из мусорных баков и ментовской мебели, спижженый из кабинетов вискарь, сорванные решетки, разбитые окна и костры всяких бумажек, которые не были заперты.</p>
<img alt="https://lh6.googleusercontent.com/FwQXUT6bMIKtYnM9VWnZH0UfCo6LsyWPBOZlnz0C9ps=w703-h527-no" src="https://lh6.googleusercontent.com/FwQXUT6bMIKtYnM9VWnZH0UfCo6LsyWPBOZlnz0C9ps=w703-h527-no" />
<p>Один из непредвиденных эффектов данного события - телефон 102 перестал работать, потомучто АТС в главном здании была на первом этаже, решетки слабенькие - ну вы понимаете. Оторвали все с мясом.</p>
<p>Ясное дело, бытовая преступнасть выходной не взяла, всякие ограбления, поджоги и мародерства происходили, а звонить некуда. Шо вы думаете произошло? Хаос, безнаказанность, грабь-воруй? Неа.</p>
<p>На следующий же день на каждом долбаном столбе появились телефоны горячей линии, куда звонить есишо, плюс телефоны участков. Плюс стали ходить патрули в зеленых жилеточках. Опятьже вылез в телеящик мер и сказал, куда звонить, как проявлять бдительность и ваще не паниковать.</p>
<p>Потом появилась всякая агитация типа "повстанец - не варвар, не руйнуй родной город". При этом агитация появляется сразу, она качественная и по делу. Город живой, он разговаривает.</p>
<img alt="https://lh6.googleusercontent.com/qmD-r556C4gK36LGahhswYzG170m2ScthHjCzxJt2vE=w395-h527-no" src="https://lh6.googleusercontent.com/qmD-r556C4gK36LGahhswYzG170m2ScthHjCzxJt2vE=w395-h527-no" />
<img alt="https://lh6.googleusercontent.com/mZcd0MKxdzs8d5ZneyGsUj9DYM4nbMjM6wCuCNW7LH0=w395-h527-no" src="https://lh6.googleusercontent.com/mZcd0MKxdzs8d5ZneyGsUj9DYM4nbMjM6wCuCNW7LH0=w395-h527-no" />
<p>Кроме агитации, которая конкретна и по делу, есть еще очень много флагов. Вешают с балконов, из окон, вешают в витринах магазинов. Владельцы бизнеса не пытаются делать вид, что они не люди, не боятся выражать какую-то свою позицию. Флажки упа на машинах - это вообще как "добрый день". В феврале было много всякого "записывайся в сюда", "едь на Киев, сбор в пункте таком-то" ну и в таком духе. Качество материалов разное - от крутых плакатов до листиков формата A4, приклеенных скотчем.</p>
<p>Еще интересный образчик - таблички "цены не повышаем, верим в гривну, верим в Украину". Умеют люди, да.</p>
</div>
<div class="section" id="section-3">
<h2>Магазины</h2>
<p>В центре нету супермаркетов. То есть вообще нету. Есть мелкие магазинчики с прилавком и soviet-style продавщицами, которые ясно дело не круглосуточные. Зато есть забавный обычай писать краской на стене магазина список того, что там есть. На нескольких языках. Выглядит весьма.</p>
<p>Еще очень странно видеть, что рынок не работает в воскресенье. Ладно бы магазины, но базар, который в воскресенье закрыт - это для меня культурный шок. На Пасху все было закрыто дня три подряд и до сих пор половина рядов пустые.</p>
<p>Кроме того, есть всякая уличная торговля в виде бабушек, продающих что-то прямо с газетки - всякий там творог. Ну или торговля с машины. В Одессе давно такого не видел. Еще возле рынка есть валютные менялы, которые просто стоят на тротуаре с пачками денег вообще не стесняясь.</p>
</div>
<div class="section" id="section-4">
<h2>Пасха</h2>
<p>Перед Пасхой наблюдал очереди перед церквями. Приезжают такие семьями, с лукошками, рушниками и в вышиванках. Паркуются за пару кварталов, чинно идут в церкву у меня за углом. Много.</p>
<p>В выходной почти все было закрыто, по городу все тусили в вышиванках. Толпы гуляли просто адские. При этом Пасха тут - это не раз-два и в продакшн, это процесс на неделю где-то. Вот уже среда, а сегодня какой-то чувак пытался что-то мне впарить и здоровался словами "Христос воскрес". В школах, вроде, вообще каникулы.</p>
<p>На центральном проспекте происходит ярмарка, на площади возле ратуши в понедельник обливались водой (почти как в Тае). Обливания вроде как традиционные, но у некоторых особо буйных не хватает мозгов - который год находятся школоло, которые бегают по городу и обливают всех подряд. В этот раз мерия решила все организовать цивильно, сделали план-схему в каких местах обливать можно, а в каких нельзя. Школоло это конечно не остановило, стали бузить не по схеме, после чего прибежала самооборона и зафигачила мокрых артистов электрошокерами. Вобщем Европа-Европой, а славянская неистовость все равно прорывается, даже тут.</p>
</div>
<div class="section" id="section-5">
<h2>Тротуары</h2>
<p>Тут все паркуются как мудаки. Мерия постепенно окукливает тротуары столбиками. Помогает конечно. Если еще маршрутки перестанут тормозиится на переходах и таксисты не будут юзать кусок дороги под стоянку - будет вообще красота. Также видел всякие попытки разъяснительной работы в виде листовок под дворник.</p>
<p>В обитаемой части города почти все тротуары зафигачены плиткой разне степени ушатанности. Есть вяленькие попытки понаделать велодорожек, но пока это больше похоже на профанацию.</p>
<p>Что еще радует - нету отвратительных Зелено-желтеньких заборчиков. Сами заборичики, к сожалению есть. Ну и конечно же - водосточные трубы, которые не льют воду на троутуар, а уходят под землю. Инопланетная технология из будущего.</p>
<p>А еще тут есть улицы Джорджа Вашингтона, Джона Ленонна и Джахара Дудаева.</p>
</div>
<div class="section" id="section-6">
<h2>Язык</h2>
<p>Дефолтный язык тут конечно же украинский. За русский косо не смотрят, в морду не бьют, в сфере обслуживания могут и ответить. Какие-то люди между собой на русском говорят. Но по-дефолту большинстве случаем все равно украинский, при чем видно, что некоторой части населения русский - очень неродной язык, практики мало, словарный запас такой.</p>
<p>Еще тут говорят "дякую вам", "хлопы" и имеется набор локальных слов, которые я не понимаю. Произношений тут несколько разных, но все отличаются от того, которое в Одесской области. На улицах попадаются бабушки с горным загаром и каким-то немного отличающимся видом лица. Или из Карпат или меня глючит.</p>
<p>Вывески и реклама на украинской почти все. В старой части города бывают надписи на иврите и польском.</p>
</div>
<div class="section" id="section-7">
<h2>Трамваи</h2>
<p>Во Львове трамваев есть. Части города, куда на трамвае доехать нельзя я полагаю за дикие ебеня. Забавно, что талоны на проезд тут продаются на остановках и в автоматах пополнения счета, а в самом трамвае - только у водителя и только на остановке. Талоны надо компостировать адской железной штукой, иначе могут поймать и сделать ата-та.</p>
<p>Иногда трамваи ломаются, стоят, горят на ходу. Рельсы вроде как новые, но местами ушатаны. Технологию на глаз определить не могу, но пдозреваю - это BKV, на которых Буслоу ругался. Вагоны все одинаковые, квадратные - татры KT4, не такие буханочки, как в Одессе. Новый, который похож на звездоолет - только один.</p>
</div>