Как стать автором
Обновить

Комментарии 44

Достойный ответ проприентарному криптопровайдеру!
Но остаётся открытым вопрос о том, как без «проприетарного криптопровайдера» (как сказали выше) вытащить со «свистка» криптоконтейнер (потому что далеко не все из предоставляемых «свистков» (если честно, я вообще ни с одним таким не сталкивался) монтируются как флешки, чтобы была возможность просто взять и добраться до /mnt/bla/*.000
НЛО прилетело и опубликовало эту надпись здесь
Позвольте не согласиться: вытащить можно и даже нужно (ну хотя бы для резервной копии). Делается это на машине с установленным КриптоПро CSP + драйвера токена:
запускаем КриптоПро CSP (в Windows cpconfig.cpl);
на вкладке Сервис выбираем кнопку Скопировать...;
источник токен, приемник флешка (могут быть проблемы, если не установлен считыватель «Все съемные диски»).
С флешки можно спокойно пересылать контейнер хоть по мылу.
Если используется реальный токен (хоть тот же рутокен эцп или etoken), а не поделие на основе флешки, то вытащить оттуда приватный ключ — крайне сложная деструктивная операция (микросхема, на которой хранится ключ, будет физически разрушена).
Боюсь, что вы плохо представляете, что любое обращение к ключу — это чтение даже из самого супер защищенного хранилища, операция копирования требует только чтения. Дальше додумаетесь сами?
Криптотокен часто не предоставляет операции чтения. Он предоставляет операции типа хэширования, подписи и дешифрования (всё это выполняется на токене). Плюс управление приватными ключами и сертификатами, которое в случае ключей часто сводится к «сгенерировать ключ», «записать ключ» (с хоста на токен). Посмотрите на интерфейс pkcs11 или pcsc.
Я разрабатывал подобные «крипто-свистки» и архитектура была спроектирована таким образом, что исключалась возможность чтения ключей ЭП даже инвазивными методами, не говоря уж о программных. Это закладывалось в топологию микроконтроллера. Вот) И запросы библиотеки криптоинтерфейсов анализировались строжайшим образом перед их выполнением) Компания «Крипто-Про» и ее партнеры заботятся о своих ключах не хуже (в серьезных продуктах, конечно). Так что, на мой взгляд, легче «купить» владельца или прибегнуть к «термо-криптоанализу», чем пытаться вытащить ключ из серьезного крипто-свистка.
исключается возможность или делается очень дорогой?
делает возможность настолько дорогой, что «овчинка выделки не стоит»)
Неужели нет секретной команды «выдай мне все ключи»? Неужели ФСБ такое сертифицирует? )
«Нет», конечно. О чем Вы говорите?))
Боюсь, что вы плохо разбираетесь в предмете и осмеливаетесь других в этом обвинять. Вам не приходило в голову, что можно закачать в токен информацию, которую надо зашифровать или подписать, и получить из токена зашифрованную инфу или подпись? и тогда ключу нет нужды покидать пределы носителя. Так работают нормальные токены и смарт-карты. Потому они и смарт.
Существуют разные способы хранения ключей на токене (в том числе и среди продуктов КриптоПро). В предыдущем комментарии речь шла о неизвлекаемых ключах.
там еще есть галочка, при создании ключа «возможность тиражирования» или как то так. Если правильно помню — на то, чтобы поставить такую галочку при генерации ЭЦП для электронных торгов с меня хотели еще +1000 рублей. Без этой галочки ключ с рутокена просто не копируется.
Прошу прощения, а зачем? Токены, в принципе, для того и существуют, чтобы из них ничего нельзя было вытащить.
Зачем? Дерзните сделать гостовую подпись в браузере под линуксом с помощью такого хардварного токена.
Есть некоторая беда с этими токенами. Заключается она в том, что поддержка этих токенов должна быть сделана на сайте с помощью плагина, коих сейчас уже небольшой зоопарк. Сделать функционал ЭП по ГОСТу с помощью стандартных механизмов браузера у таких токенов увы нельзя. С плагинами есть другая беда: большая часть плагинов используют NP API, который выпилен из Хрома и вот-вот выпилят из Firefox.

Под виндой работа с данными токенами тоже не самый удобный вариант, так как при работе с ними через Crypto Pro или другое популярное СКЗИ данный токен превращается в тыкву флэшку. Работа Microsoft Crypto API поддержана только для RSA части этого токена. А вот функционал ГОСТовских функций по аппаратной подписи надо тянуть через PKSC#11, но программ, которые поддерживают такое под виндой в дополнение к MS Crypto API днём с огнём.
Как флешка монтируется обычная флешка с контейнером в виде отдельной папки. В общем-то это самый популярный и самый доступный тип токена в случае с Крипто-ПРО. И с него-то вытащить ключи сложнее всего, потому что формат хранения -проприетарный.

С настоящими токенами гораздо легче — есть pcsk11-tool, есть, в конце концов, утилиты от производителей токенов. Если ключ сгенерирован на токене как неэкспортируемый, то, естественно, его ничем не вытащишь, но, как правило, ключ делают выгружаемым, чтобы можно было сделать копию, потому что вероятность использования ключа злоумышленниками намного ниже, чем вероятность его, например, утраты или поломки.

Так что автору — респект.
как правило, ключ делают выгружаемым, чтобы можно было сделать копию
Ужас какой. Кто и где делает ключ выгружаемым? В нормальных компаниях с «утратой или поломкой» борются просто: упрощением регистрации нового ключа. В идеале — это должен иметь возможность сделать сам клиент без участия службы поддержки — примерно так.

Самое дебильное — что ведь кто-то что-то там ведь проверяет, сертифицирует, разбирает. Куча денег вертится. Но при этом самое элементарное — похоже никто не проверяет. Зачем тогда всё это? То есть я понимаю, что для большинства людей «безопасность — это такая галочка, без которой клиенты не придут/договор не подпишут», а как оно там реально защищает ваши данные — неважно, но, чёрт побери, всему же есть предел!

Обнаружение экспортируемого ключа в продакшене — это же ЧП. Кто-то что-то настолько не понимает, что «с дуба рухнул» и решил дискредитировать всю идею аппаратных токенов… А тут оказыватся, что «как правило ключ делают выгружаемым»… грустно это…
это вы просто с работой со СМЭВ не сталкивались…
Не сталкивался. И проводку у себя в доме не я монтировал. И даже систему гидроусиления руля я не чинил. Но что это, собственно, меняет?..

Обратная сторона российской «смекалки»: если кто-то разработал систему, в которой что-то делать неудобно, элементарная операция регистрации дополнительного ключа (которая должна быть элементарной и бесплатной) требует кучу времени и сил и/или денег, то мы это как-нибудь обойдём. «Жучок» поставим чтобы пробки не горели, датчик кувалдой забьём, если он на свое место не лезет, ключи экспортируемыми оставим. Всё — из самых лучших побуждений.

А потом — дома горяд, ракеты падают, деньги пропадают.

Смысл существования криптотокена — в неизвлекаемости помещённых в него ключей. Это, собственно, единственное оправдание его сущесвования. Использовать экспортируемые ключи вне разработки — должно быть как минимум поводом для увольнения за халатность, а как максимум — и для привлечения к отвественности (в зависимости от того кому и сколько таких ключей было выдано).

А то над паролями, записанными на бумажечке и приклеенными к монитору — все смеются. А когда ключи выдаются с PINом 12345678 и с экспортируемыми ключами — это как будто «так и надо»…
Я вам даже больше скажу. На сегодняшний день большая часть УЦ использует в работе софт КриптоПро, который позволяет создавать пары ключей только на убогих токенах. Более того, подавляющая часть УЦ не даёт (своим регламентом) клиентам возможности получить сертификат по запросу сертификата.

Таким образом, всё гораздо хуже, потому что приватный ключ генерирует УЦ. Причем он может его скопировать себе в этот момент.

Если вы действительно знаете, что такое безопасность, то, конечно, потратите время и найдете УЦ, который работает с запросами. Но большинство УЦ, а стало быть и их клиентов живут вот так вот.
НЛО прилетело и опубликовало эту надпись здесь
Это обусловлено требованиями к безопасности. Приватный ключ с криптоключа вынуть нельзя (теоретически — даже с использованием электронного микроскопа нельзя, практически — как минимум нельзя это сделать с помощью «подручных» средств).

У меня, скажем, подобный ключик вставлен раз и навсегда в ноут, в котором и ездит. Пока он находится в моём распоряжении — всё, что с его помощью производится — это моя ответственность и мои проблемы (если я его утеряю или, скажем, таможенники заберут ноут и отправят «на проверку» — я должен немедленно об этом сообщить, чтобы ключ аннулировали).

Главное: так как ключ скопировать нельзя, то никакие «отмазки» и «происки конкурентов» во внимание не принимаются: ключ был у меня в руках — значит я за то, что произошло с его помощью и отвечаю.

Какой смысл класть на такой ключ экспортируемый сертификат — науке, понятно, неведомо. В этом смысле он работает как обычная флешка и никакого преимущества над оной не имеет.
У меня, скажем, подобный ключик вставлен раз и навсегда в ноут, в котором и ездит.
Я такого избегаю, вставляю только когда надо что-нибудь подписать. У yubikey был security bug в openpgp-апплете, который позволял производить операции без пина.
Этот security bug можно поиспользовать только «позаимствовав» мой ноут на какое-то время и разблокировав его. То есть это могут сделать только «свои» (если у меня украдут ноут и я ключ аннулирую, то дальше уже неважно — знает ли кто-то PIN или нет). А со «своими» бороться сложнее — они могут и троян поставить, если я куда-нибудь отойду и забуду ноут заблокировать.

Так что да — вынимать ключик безопаснее, но это уже «o малое». В любом случае нужно у меня своровать некопируемый ключ. А вот если ключ из токена экспортируется — тогда вообще неясно зачем он нужен.

Ну да, это требует компрометации системы. И вариант с трояном принципиального отличия не имеет. Разве что в нормальном варианте необходимо ещё перехватить ещё PIN (проанализировать выхлоп кейлоггера), а при использовании соответствующего бага это не нужно. Но и тот, и другой риск стоит рассматривать при угрозе таргетированной атаки, когда эта разница в стоимости атаки уже несущественна.


Так что да — вынимать ключик безопаснее, но это уже «o малое». В любом случае нужно у меня своровать некопируемый ключ. А вот если ключ из токена экспортируется — тогда вообще неясно зачем он нужен.

Этого я тоже не понимаю. Выглядит ещё более дико, нежели ключи на флешке, которые просто от бедности и нежелания осуществлять поддержку более сложной системы с криптопровайдером.

Этого я тоже не понимаю. Выглядит ещё более дико, нежели ключи на флешке, которые просто от бедности и нежелания осуществлять поддержку более сложной системы с криптопровайдером.
Если бы. Вы, конечно, шутите, Мистер Фейнман! — читали? Вспомните про историю с Капитаном (ниже — маленькая цитата):
Кабинет Капитана помещался на третьем этаже одного из тех собранных на скорую руку деревянных зданий, в которых у всех нас были кабинеты, а заказанный им сейф был железный и тяжелый. Такелажникам пришлось делать деревянные помосты и использовать специальные тали, чтобы поднять его по лестнице. Так как развлечений у нас было немного, все мы собрались поглазеть на великие усилия, с которыми сейф тащили в кабинет Капитана, и похихикать насчет секретов, которые он будет хранить в этом сейфе. Кто-то даже предлагал махнуться сейфами. Словом, об этом сейфе знали все.



– Но ты же открыл его! Значит, ты знаешь, как вскрывать сейфы.

– О да. Я знаю, что замки приходят с завода установленными на 25–0–25 или на 50–25–50, и я подумал: «Чем черт не шутит. Может этот олух не потрудился сменить комбинацию», и вторая комбинация открыла замок.

Итак, кое-что я от него все же узнал, – он открывал сейфы тем же чудодейственным способом, что и я. Но занятнее всего все же было то, что этот индюк Капитан получил супер-суперсейф, не постеснялся заставить пыхтеть кучу народа, которая тащила его сейф наверх, а потом даже не позаботился установить свою комбинацию.

Я прошелся по кабинетам своего здания, пробуя эти две заводские комбинации, и открыл каждый пятый сейф.
То же самое и здесь: люди думают, что использование «настоящего криптотокена» каким-то чудодейственным образом улучшает безопасность — даже если не использовать фичи, ради которых, собственно, криптотокен и существует.

Это — безумно грустно, но, увы, люди всегда так были устроены…
Я тоже никогда не понимал, зачем нужен криптотокен, если любой мало-мальски продвинутый троян при первом же доступе к токену со стороны легального софта, со вводом пина, может послать токену команду сделать левую ЭП?

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

А если в дополнение к кнопке сделать небольшой экран, где будут подсвечены реквизиты документа, хотя бы минимально получатель платежа и сумма — это будет просто замечательно, тогда троянец сможет надеяться только на невнимательность пользователя.
Тогда сделали бы разработчики хотя бы кнопку — на токене загорается красная лампочка, что значит большой компьютер просит вычислить ЭП, пользователь видит лампочку и нажимает кнопку, соглашаясь произвести подпись. При этом должна быть сделана только одна ЭП, нужно исключить дребезг кнопки и т.д.
Так и сделано — посмотрите на вторую фотку. Лампочка, правда, зелёная и кнопки нет (поднесение пальца определяется за счёт изменения индуктивности при касании), а так — всё как вы просили.

А если в дополнение к кнопке сделать небольшой экран, где будут подсвечены реквизиты документа, хотя бы минимально получатель платежа и сумма — это будет просто замечательно, тогда троянец сможет надеяться только на невнимательность пользователя.
Такое тоже делается, но обычно только для перевода крупных сумм. Есть токены, вообще электрически не связанные с компьютером (данные передаются через пару светодиодов, подтверждение появляется на экранчике, четыре цифры человек потом вбивает в формочку). Любой каприз за ваши деньги — вопрос только в том, как убедить людей этим пользоваться.
возможен ли обратный процесс? Можно ли сделать 6 .key файлов из одного?
Да, возможен, для этого надо уметь рассчитывать контрольные суммы, которые проверяются при зачитывании ключевых файлов в Крипто-Про.
Это вы о том, что в начале статьи упомянуто как «в худшем случае состоящее из более чем 2000 (двух тысяч) операций хеширования»?
Нет, это так пароль «перемешивается» по 2000 раз, наверное, чтоб брутфорсить пароль было более трудоемко.

Я имел в виду другие контрольные суммы, которые есть в ключевом файле, но которые не являются необходимыми для проверки правильности хранения секретного ключа. Потому что главный критерий — это когда мы, в самом конце, вычисляем публичный ключ «на лету» и сравниваем первые 8 байт с теми, что хранятся в ключевом файле. Зачем же еще что-то дополнительно контролировать?

В моем примере необязательные контрольные суммы игнорируются, но в обратном процессе их игнорировать нельзя — Крипто-Про тогда не прочитает ключевой файл.
Стоит упомянуть о существовании утилиты P12FromGostCSP которая позволяет конвертировать ключ в формат P12, доступный для работы с OpenSSL, но утилита имеет следующие существенные недостатки:

Читает контейнер не напрямую, а через криптопровайдер, поэтому там, где кроме OpenSSL ничего нет, не работает.
Если в свойствах ключа не отмечено, что ключ «экспортируемый», то конвертировать его невозможно.


Так то оно так, но как вы вытащите закрытый ключ, если он хранится не на флешке, а на токене. Здесь не идет речь о ГОСТ-овых токенах PKCS#11. Как вы получите доступ к необходимым объектам для получения закрытого ключа?
Думаю, через opensc можно получить доступ к любому токену, поддерживающему pkcs11 интерфейс и вынуть ключ, если в свойствах ключа стоит «экспортируемый».

Но пока задачи такой не стояло, потому что ни один уважающий себя токен не делает ключи с такими свойствами, иначе смысл токена теряется.
Если экспортируемый — то да!
В функции make_pwd_key фигурирует XOR с числами 0x36 и 0x5C. Это случайно не HMAC?
Это не HMAC, это CPKDF — CryptoPro key derivation function
Интересно.
Попробовал провернуть такую же процедуру но со следующим ключиком:
CryptoPro Gost PrivateKey (GOST3410DH_2012_256) with parameters: 1.2.643.7.1.1.6.1


Попробовал openssl-1.1.0g с gost-engine 3bd506dcbb835c644bd15a58f0073ae41f76cb06

К сожалению не понял откуда взять (да и видимо к этому ключу не они нужны)
fill_GOST2001_params
gost2001_compute_public
store_bignum


Кажется автор может знать, как такое же провернуть с ключём GOST3410. Если я верно понимаю то нужно делать это с помощью github.com/gost-engine/engine?
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации