В марте прошлого года я писал про направление атак, связанное с датчиками систем управления техпроцессами:

Особенно богаты на уязвимости беспроводные системы сбора информации: в случае с проводами – злоумышленник ещё должен добраться до провода, подключиться к нему (что, впрочем, не так уж невероятно, если речь идёт о стратегически важных объектах); радиообмен, обычно осуществляемый в открытом виде без аутентификации, упрощает задачу – данные, в рамках атаки, можно транслировать со значительного расстояния, вплоть до передачи с борта самолёта.

Эта тема, действительно, быстро развивается. Например, на Black Hat заявлен доклад как раз про устройства мониторинга уровня радиации, где речь должна идти и о беспроводных датчиках.



Комментировать »

Схемы с квантовым распределением ключей (или квантовая криптография, часто их называют так) – интересны тем, что в них большую роль играют утечки по побочным каналам. Почему-то часто приходится читать и слышать, что квантовая криптография обладает “абсолютной стойкостью” и её “невозможно взломать, так как взлом запрещён физическими законами квантовой механики”. Понятно, что подобные рассуждения соотносятся с реальностью примерно так же, как элементарная задача о бруске, который под действием силы тяжести без трения скользит по наклонной плоскости, со спуском горнолыжника по “чёрной” трассе (повышенной сложности). То есть, для “сферического в вакууме” случая про квантовую криптографию тоже всё верно написано, но на практике – можно здорово упасть с горы.

Квантовые протоколы предполагают, что стороны смогут определить факт прослушивания канала при помощи статистического анализа принятых квантовых значений, сравнивая переданные и принятые данные при помощи открытого канала. Действительно, если прослушивающая сторона принимала передаваемые фотоны (или другие носители “квантовой информации”), то она обязательно внесла изменения в статистику и будет обнаружена. Проблема в том, что кванты генерирует и излучает вполне классическая установка. Рассмотрим простой воображаемый аппарат, где поляризация испускаемого фотона задаётся при помощи вращающегося диска с набором фильтров: лазерный импульс генерируется в случайный момент времени – фотон проходит через тот или иной фильтр, оказавшийся на его пути, и соответственно поляризуется. В этой схеме определить поляризацию фотона можно не измеряя его – достаточно знать, в каком положении находился диск в момент излучения импульса. Предположим, что двигатель, который вращает диск, излучает систематическую помеху. Тогда положение диска можно вычислить по этой помехе (да, может потребоваться дополнительная информация о стартовой конфигурации и т.п., но это детали). Момент, в который лазер генерирует импульс-источник фотона, также можно определить по той или иной помехе, например, разряд наводит некоторое “эхо” в цепи питания (вариант не столь теоретический, как может показаться). В случае использования более продвинутой системы, построенной на квантовой запутанности, соответствующие утечки информации могут происходить в момент измерения передающей стороной своей части накопленных квантовых пар. Логика прослушивания при этом не меняется.

Если схема защиты передаваемого ключа базируется только на анализе сторонами статистики переданных квантов, то сторона, прослушивающая наводки и побочные излучения передатчика, в идеальном случае получает ту же информацию о ключе, что и участники обмена (соответственно, доступна даже проверка того, что канал, на квантовом уровне, не прослушал кто-то ещё; для этого нужно прочитать в открытом канале сообщения принимающей стороны). Естественно, реальная ситуация заметно сложнее, но и источников утечек – больше: реальная аппаратура содержит большое число элементов, при этом атакующая сторона может использовать активные методы, с отправкой зондирующих импульсов, внедрением разнообразных аппаратных закладок.

Так что говорить о том, что квантовая криптография обеспечит “абсолютную защиту” “на уровне физических законов” – неверно: эти же самые физические законы разрешают всевозможные утечки информации по побочным каналам, от которых необходимо защищаться вполне классическими методами. И тут, по сравнению с современными криптосистемами, ситуация никак не меняется.



Комментировать »

Одна из основных перспективных особенностей самоуправляемых автомобилей-роботов состоит в том, что они смогут обмениваться информацией в режиме онлайн. Например, когда одному из автомобилей потребуется сменить полосу движения, он может практически мгновенно договориться об исключении помех в движении с другими машинами, которые едут неподалёку. Считается, что роботами задача оптимизации совместного движения решается существенно лучше, чем “человеческими водителями”. Поспорить с этим довольно сложно. Методы оптимизации известны, протоколы обмена информацией и выработки решений – можно разработать.

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

Предположим, что автомобили-роботы при помощи радиообмена умеют договариваться о том, что один из них безопасно пропустит другой. Однако в протоколе есть дефект, позволяющий, через манипуляцию заголовками пакетов, ввести систему управления одного из автомобилей в некоторое “замешательство”. Не важно, как именно достигается такой эффект: думаю, нет никаких причин для особенных сомнений в “стойкости” автомобильных решений. То есть, получаем ситуацию, когда “хакерский” автомобиль, с чуть изменённой прошивкой, обеспечивает себе право преимущественного проезда, эксплуатируя дефект протокола. (Тут можно заметить, что строгое правило обеспечения преимуществ в движении – несомненно будет внедрено в систему управления автомобилей-роботов, стандарты и технические требования уже готовят.)

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



Комментарии (1) »

Прямое и универсальное использование квантового компьютера для “взлома” симметричных шифров сводится к (квантовому) поиску при помощи алгоритма Гровера (это аналог полного перебора вариантов). Из-за квадратичного выигрыша, который даёт данный алгоритм относительно перебора на классическом вычислителе, симметричные шифры для сохранения практической стойкости должны использовать ключи в два раза большей разрядности. Но квантовый компьютер может быть использован и для криптоанализа, направленного на тот или иной конкретный шифр, то есть, для снижения стойкости конкретного шифра, а не для простого перебора: успешный криптоанализ – позволяет существенно снизить “мощность перебора”. При этом универсальный квантовый компьютер можно применить для реализации уже наработанных классических техник криптоанализа (с тем или иным выигрышем в производительности, либо без выигрыша), а можно разработать некие новые квантовые методы криптоанализа, что гораздо интереснее.

Эти квантовые методы должны использовать какие-то свойства взламываемого шифра, которые хорошо проецируются именно на возможности квантовых вычислений. Пример. Предположим, что для для заданного шифра можно построить некоторую периодическую функцию, разбивающую всё пространство ключей на интервалы. Период этой функции может эффективно определить квантовый компьютер (это типичная задача, так, на поиске периода основан квантовый алгоритм Шора факторизации чисел). Знание периода позволяет путём анализа нескольких пар, состоящих из открытого текста и соответствующего ему шифротекста, определить, в какой именно из интервалов попадает секретный ключ, а дальше уже перебирать значения только из этого интервала, который, предположим, невелик. (Можно переформулировать: пусть обнаруживается период функции, определяющей возможные ключи – в таком случае, зная период, можно будет проверить только их, прыгая по значениям.) Пары открытых текстов и шифротекстов часто известны на практике. Скажем, HTTPS, использующий TLS в качестве транспорта, подразумевает передачу куки-файлов или известных заголовков запросов. При этом режим счётчика (GCM и пр.) основан на зашифровании последовательных значений. Это грубое изложение, но оно математически сходно с атаками, которые уже несколько лет обсуждаются в публикациях, применительно к различным режимам симметричных шифров.

Другими словами, алгоритм Гровера, “грубый поиск”, является универсальным. Если он будет реализован (а для реализации, применительно к шифрам, потребуется сложный квантовый компьютер с тысячами кубитов), то это затронет стойкость всех симметричных шифров, но приведёт “всего лишь” к росту разрядности ключей в два раза. Однако неверно полагать, что не существует куда более эффективных квантовых методов криптоанализа, которые, в случае появления мощного квантового компьютера, снизят до уровня непригодности стойкость если не самих используемых сейчас симметричных шифров, то их повсеместно применяемых режимов работы.



Комментарии (1) »

Google намеревается в браузере Chrome резко ограничить доверие SSL-сертификатам, выпущенным удостоверяющим центром Symantec. Это касается и других брендов Symantec: GeoTrust и Thawte, главным образом, а также прочих “партнёрских” линеек. Речь идёт о принудительном снижении допустимого срока валидности (не более девяти месяцев – коммерческие сертификаты обычно выпускаются на год и более, это одна из их важных особенностей) и отключении EV-статуса (“расширенная проверка”, самые дорогие сертификаты). Это реакция на выявленные нарушения политик и требований к работе УЦ.



Комментарии (1) »

Достаточно давно (больше семи лет назад) я уже писал о том, что аппаратные закладки можно активировать и в системах, которые к “внешним” вычислительным сетям не подключены, но обрабатывают информацию, поступающую извне. Вообще, введение в модель угроз подобных особенностей оборудования до сих пор встречается нечасто (если речь не идёт о полноценной РЭБ, конечно). Так, разговоры про защиту автоматических систем управления на производстве (АСУ ТП) регулярно сводятся к предложению “установить антивирус” на ПК и тщательно проектировать “сетевые соединения”, а это всего лишь защита от угроз из прошлого, да ещё и сложившихся на других платформах (“офисные системы”), отстающая на один шаг от реальности.

Развитие даже потребительской техники движется в сторону освоения новых сред распространения сигналов и, потенциально, передачи программного кода. Например, обработка голосовых команд давно стала стандартной функцией, однако эти команды могут передавать и одни устройства другим. Причём, не обязательно имитировать человеческий голос, хотя данное направление выглядит весьма занимательно. Есть решения, в которых данные передаются незаметно для пользователя, ультразвуковыми сигналами. Сейчас активно формируется новая среда передачи данных между большим количеством различных устройств. В этой среде нет брандмауэров и сетевых фильтров. Микрофон системы управления “умным домом” не может не принимать сигнал напрямую, иначе им было бы невозможно пользоваться. Побочный эффект: теперь динамики телевизора могут излучать сигнал, транспортирующий инъекцию кода в “умный дом”. Предполагать, что акустический сигнал не может содержать кода вторжения – примерно столь же наивно, как считать, что любые файлы .PDF можно абсолютно безопасно открывать, так как они изначально не являются исполняемыми. Заметьте, что голосовые команды – они уже команды, то есть, в самой концепции прямо связаны с управляющим кодом системы (и реализуются соответственно).

Возникает новое пространство, новые транспортные каналы, слабо связанные с классическими решениями – проводными и беспроводными (WiFi). Естественно, не только акустические: есть немало электромагнитных вариантов (разнообразные радиоканалы Интернета вещей), и даже “офлайновые” схемы – графические коды (QR и пр.). Всё эти каналы подходят для передачи, в том числе, вредоносного кода между большим количеством устройств. А привычный периметр защиты, который уже давно является весьма размытым, скоро будет стёрт окончательно.



Комментарии (2) »

В криптографической библиотеке для Arduino используется российский шифр “Магма” (ГОСТ 34.12-2015). Я сравнил свою реализацию “Магмы” из библиотеки с другим “малым” шифром – Speck, который был предложен в 2013 году специалистами АНБ. Чтобы сравнение было точнее, я также реализовал Speck, использовав inline-ассемблер (ссылка на исходный код – в конце записки).

Прежде всего – краткое описание шифра Speck. Это новый блочный шифр, специально разработанный для программной реализации в микроконтроллерах, то есть, вычислителях с сильно ограниченными ресурсами. Как и многие другие современные шифры (а также и “Магма”), Speck построен на базе простой “раундовой” функции, которая последовательно вызывается с разными ключами, проводя преобразование блока данных. В Speck эта же функция используется для разворачивания основного ключа в последовательность ключей раундов. Это первое существенное отличие от “Магмы”, в котором разворачивание ключа сводится к копированию (см. описание “Магмы”). Спецификация Speck вводит несколько вариантов шифра, имеющих разную разрядность блока и ключа. Я использовал наиболее близкий к “Магме” вариант: 64-битный блок и 128-битный ключ (256-битного, по ключу, варианта Speck для 64-битного блока – нет, поэтому сравнить шифры на одной длине ключа нельзя). От варианта к варианту в Speck различаются количество раундов и часть параметров раундовой функции (разрядность логических сдвигов).

На картинке ниже – подробная схема раунда Speck (шифрование).

Входной блок разбивается на две части. Это, опять же, одно из распространённых и хорошо проверенных решений в схемах шифров. Левая часть (A1 на схеме) циклически сдвигается вправо на 8 разрядов, суммируется с правой частью (A0) по модулю 232 (то есть, как два 32-разрядных числа “естественным образом”, без переноса и знака; операция обозначена символом ⊞). На следующем шаге выполняется сложение по модулю 2 (XOR, ⊕) с раундовым ключом. После чего результат обработки полублока суммируется (опять же, XOR) со вторым полублоком, который перед этим циклически сдвигается на три разряда влево.

В шифре “Магма” используется схема Фейстеля, в которой полублоки, после применения раундовых преобразований, переставляются. Раунд шифра Speck также можно привести к схеме Фейстеля, разделив на два этапа. Первый этап включает преобразования левой части, за которыми следует перестановка полублоков. Схема:

Второй этап – состоит в применении сдвига и XOR к результату первого этапа. Схема:

То есть, с некоторой долей условности можно сказать, что Speck построен из двух, применяемых последовательно, конструкций Фейстеля.

Раунды выполняются циклически. Для используемого варианта шифра число повторений равняется 27. Таким образом, требуется 27 раундовых ключей, каждый разрядностью 32 бита. Схема их получения из исходного, 128-битного, ключа состоит в последовательном применении той же раундовой функции к ключу, предварительно разбитому на слова, разрядность которых совпадает с разрядностью полублока. То есть, 128-битный ключ (16 байтов) даёт нам четыре слова по 32 бита. Эти слова служат левым и правым полублоком в раундовой функции. Ключом (Ki на схеме) при этом является номер раунда. Другими словами: первый раундовый ключ – это младшие 32 бита исходного, основного ключа (используются прямо). Второй раундовый ключ – младшие 32-бита результата применения раундовой функции к младшим 64 битам основного ключа (очевидно, что сюда, в качестве правого полублока, входит первый раундовый ключ); и так далее, подробнее можно посмотреть в исходном коде.

Переходим к сравнению шифров. Ассемблерная реализация позволяет посчитать примерное число тактов, необходимых для выполнения преобразований шифра. Для Speck подсчёт дал 1951 такт – столько занимает полная реализация, с обращением к памяти, где хранятся раундовые ключи и блок открытого текста, с выгрузкой результата. Сюда не входит код получения последовательности раундовых ключей (развёртывания ключа). 1951 такт, в пересчёте на байт данных (блок состоит из 8 байтов), даёт: 1951/8 = 244 такта на байт (приблизительно). В исходной работе, со спецификацией Speck, авторы приводят результат от 118 до 160 тактов для аналогичного 8-разрядного микроконтроллера, но здесь не учитываются операции по загрузке/выгрузке блоков, так что результаты довольно близки (кроме того, мой вариант можно оптимизировать).

Реализация “Магмы” из библиотеки для Arduino показывает следующие результаты: 9092 такта полный код, соответственно, 1136 (приблизительно) тактов на байт (отмечу, что показатели близки к реализациям AES). Существенный вклад в это число вносит реализация подстановок, где много обращений к памяти с достаточно сложными преобразованиями указателей. Этот код можно оптимизировать, вплоть до того, что сами подстановки разместить в регистрах (для 16 полубайтовых подстановок, закрывающих одну позицию во входном полублоке, достаточно восьми байтовых регистров; однако вся таблица подстановок в регистрах типичного микроконтроллера вряд ли поместится – для неё нужно 64 регистра). Правда, вычисление номера регистра и обращение к нему потребует дополнительных усилий, объём кода заметно возрастёт, а для “Магмы” он и так не маленький. Тем не менее, вряд ли выигрыш по тактам составит более двух раз. Из-за подстановок – “Магма” медленнее, чем Speck, тут ничего нельзя поделать.

Другим параметром, по которому можно сравнить шифры, является объём требуемой памяти данных. Для Speck нужно 108 байтов для раундовых ключей. Реализация “Магмы” требует 128 байтов (здесь больше раундов – 32). При этом, если требуется экономия памяти, “Магма” позволяет прямо использовать в качестве раундовых ключей слова из состава основного ключа. Со Speck такой фокус не пройдёт, потому что здесь сложная функция разворачивания ключа. Однако оптимизация всё равно возможна: раундовые ключи можно вычислять в процессе выполнения раундов шифра. Впрочем, такой вариант приведёт к тому, что минимум в два раза возрастёт число тактов, поэтому Speck приблизится к “Магме”. Для хранения таблицы подстановок “Магма” требует ещё 8*8=64 байта.

Реализация “Магмы” существенно превышает показатели Speck по объёму кода. И тот, и другой шифр вполне укладываются в разумные рамки, но код шифра Speck – очень компактный. Побайтового сравнения объёмов я не привожу.

Итак, “Магма” уступает Speck по показателям, относящимся к программной реализации. Неудивительно: “Магма” очень старый шифр, разработанный ещё в 70-х годах прошлого века. Как ни странно, в этом состоит его преимущество, если говорить об оценках стойкости. Этот шифр до сих пор входит в рекомендации ГОСТ и для него пока не опубликовано криптоанализа, существенно снижающего стойкость, хотя сломать шифр пытались многократно. Speck – новый шифр, выполненный в современных традициях, задуманный специально для микроконтроллеров, этим обусловлены его преимущества. Для данного шифра также пока не опубликовано криптоанализа, существенно снижающего стойкость (известные работы – предлагают академические атаки, не пригодные для практических сценариев), но нужно учитывать малое распространение и новизну шифра. Отмечу также, что Speck далеко не единственный новый шифр, ориентированный на “Интернет вещей”, однако является одним из самых простых, быстрых и компактных. Тем не менее, преимущество в скорости и возможность экономии нескольких десятков байтов – не всегда являются решающими факторами, в том числе, для устройств с малой вычислительной мощностью. Например, в случае передачи раз в час команд от устройства к устройству, разница в несколько миллисекунд, требующихся для получения криптограммы, не играет роли. (С другой стороны, каждый такт – это расход энергии элемента питания, что может оказаться существенным для устройств с экстремально низким энергопотреблением.)

В ГОСТ на средства криптографической защиты информации уже есть весьма современный шифр “Кузнечик”, сходный с AES. Однако и “Кузнечик”, и AES – не очень хорошо подходят для микроконтроллеров, так как быстрая реализация этих шифров требует довольно большого объёма памяти, который доступен далеко не для всех платформ, кроме того, часто требуются короткие криптограммы (64 бита). Вполне возможно, что в обозримом будущем в стандартах появится новый российский шифр, ориентированный именно на маломощные вычислители.

Приложение: исходный код реализации Speck для Arduino (только зашифрование), также содержит дополнительные функции для шифрования тестового вектора и проверки правильности работы.



Комментарии (2) »

Предположим, что требуется организовать скрытное прослушивание разговоров при помощи смартфона. Разговоры владельца должны записываться без его ведома и передаваться во внешнее хранилище. Понятно, что в смартфоне есть микрофон (а также динамик). Но мы не ищем лёгких путей, наша схема интереснее: в технических требованиях к ней заявлена устойчивость к анализу аппаратной и программной части смартфона. Так что от прямой записи сигнала микрофона специальным приложением, которое по расписанию прямо транслирует накопленную информацию в хранилище, придётся отказаться – подобное решение будет тут же выявлено.

Можно оснастить смартфон каким-то штатным элементом, для которого преобразование звуковых колебаний будет являться недокументированной возможностью. На такую роль годится практически всякий осциллятор, выполненный так, что воздействующие на него звуковые волны приводят к сдвигу частоты генерации – получаем частотную модуляцию. Механическим приёмником звукового давления может быть тонкая металлическая крышка (мембрана), которая выглядит как штатный экран, защищающий от помех. Схемотехника устроена таким образом, что крышка, вместе с размещёнными под ней элементами, превращается в микрофон (дополнительный). При этом сам элемент-микрофон естественным образом вписан в архитектуру телефонного аппарата: это может быть какой-нибудь задающий генератор, выделенный фильтр, или элемент усилителя – вариантов немало. Полезный акустический сигнал, после преобразования в электрический, маскируется под помеху и проходит к цифровым схемам, где “случайно” преобразуется всего лишь в один бит, который прямо кодирует принимаемую частоту. В качестве несущей может выступать достаточно высокая (относительно полосы речевого сигнала) частота, например, 1 МГц, что позволяет уверенно выделять речь из “помехи”, разрядностью в один бит.

Модуляция, наводимая колебаниями мембраны, считывается тем или иным процессором в качестве “ошибки”. Результат фильтруется, сжимается с использованием некоторого кодека, записывается в память. Вовсе не обязательно использовать для решения этих задач основной процессор смартфона – тем более, что это может вызвать подозрения. Процессоров и микроконтроллеров в современном смартфоне немало, годится модуль GPS или WiFi: очень хорошо подходит всякий сигнальный процессор, потому что обработка интересующих нас данных тут может быть хорошо замаскирована – она производится системным программным обеспечением модуля (“прошивкой”), которое исследовать весьма непросто, и которое невидимо даже для основной операционной системы.

Пусть кодирование речевого сигнала с приемлемым уровнем качества требует (с запасом) 500 байт/сек. Периоды, когда ничего не слышно, не пишутся, поэтому активности в сутки будет где-то часов пять, в самом напряжённом графике. Тогда требуемый объём памяти для хранения данных за сутки составит: 3600*5*500=9*106 байтов, или около 9 Мбайт/сутки. Сохранять такой объём в современном смартфоне труда не составляет: типичные объёмы памяти измеряются гигабайтами. Естественно, хранить запись можно незаметно для пользователя, например, зарезервировав часть памяти. И девять мегабайт – это очень большой объём речи, подавляющее большинство сценариев использования будут выдавать меньше.

Как незаметно передать несколько мегабайт информации? Неплохим вариантом является маскировка данных под случайные – шум. Для этого достаточно шифровать выходной поток, соответственно, он будет практически неотличим от (псевдо)случайных данных. Хорошим носителем для дальнейшей передачи данного “шума” являются цифровые изображения – фотографии, сделанные встроенной камерой. В них, кстати, полезный сигнал и записываться может без ведома операционной системы, непосредственно в схемах камеры. Фотографии загружаются “в облако”. Получаем стеганографический канал. Обнаруживать наличие скрытых данных может только та сторона, у которой есть соответствующий секретный ключ – для всех других “шум” выглядит как шум, обычный для цифровых камер. Проблема лишь в том, что “плотность записи” в подобных стеганографических схемах невелика, не более нескольких процентов от объёма данных, выступающих в роли носителя. Соответственно, чтобы передать 10 мегабайт скрытых данных, потребуется исходящий трафик вплоть до 500 Мбайт. С другой стороны, все 9 мегабайт разом можно было бы передать в виде одной “испорченной” фотографии – данная схема вполне реализуема, так как её тоже можно замаскировать под сбой (главное, чтобы пользователь не удалил фотографию раньше, чем она будет загружена “в облако”).

Естественно, есть и другие способы передачи “дополнительной нагрузки” на сервер: блоки с данными можно прицеплять к загружаемым “в облако” файлам как “мусор” – целый ряд широко используемых форматов позволяют так делать. Не вызывая излишних подозрений можно передавать до 20% от файла носителя, что, соответственно, уже укладывается в типичные объёмы исходящего трафика.

Таким образом, смартфон формирует нетривиальный канал утечки, а выявить данную недокументированную возможность весьма сложно (но возможно), даже если проводится исследование аппаратной части. Естественно, простой анализ приложений и операционной системы – не покажет вообще ничего подозрительного.



Комментарии (2) »

Исследователи из Google и института CWI продемонстрировали первую практическую коллизию для криптографической хеш-функции SHA-1. SHA-1 уже несколько лет считается недостаточно стойкой, но, тем не менее, до сих пор широко используется (в том числе, в SSL-сертификатах, несмотря на все ограничения). На специальном сайте shattered.it можно скачать два файла PDF, которые отличаются содержанием, но имеют одинаковое значение SHA-1 (каждый может проверить самостоятельно). Несмотря на сложность реализации этой конкретной атаки, которая потребовала больших вычислительных мощностей (они нашлись у Google), SHA-1 теперь можно окончательно признать нестойкой. Это весьма важное достижение – казалось, что SHA-1 простоит ещё пару лет.

Вместо SHA-1 следует использовать, например, хеш-функции семейства SHA-2: SHA-256 и др.



Комментарии (7) »
Навигация по запискам: Раньше »