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

Ад — это чересчур уверенные в себе разработчики, пишущие собственную криптографию

Уровень сложностиСредний
Время на прочтение7 мин
Количество просмотров36K
Всего голосов 49: ↑43 и ↓6+52
Комментарии153

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

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

Конечно, код пишут люди. Но это специальные люди, у которых есть справка от врача.

Любая мысль сведенная к короткому заголовку, лозунгу или правилу - искажается.
Я как раз хотел возразить - "пишите свою криптографию! пишите свою аутентификацию!" - потому что именно это - единственный способ набить все шишки и научиться. Но надо понимать, что шишки - будут.

Безопасность и особенно криптография - особые области. Во всех остальных, если ты плохо сделал - ты это видишь сам, или быстро найдется пользователь, у которого не работает. Студент просто не сделает сложную задачу в сложной области - все это увидят. А в безопасности - все всегда работает. (Чем больше механизмов безопасности ты отключишь или не включишь - тем даже лучше будет работать!). Давно известные правила из жизни теряют смысл, как только доходит до безопасности, вплоть до того что PRNG инициализировать из таймера нельзя. То, чему мы научились в 14 лет и всю жизнь делали, оказывается, нельзя делать!

Ой-вэй во имя Тора, песня-то не о библиотеках которые используют пациенты.

Автор всего-лишь о том, что криптография не сводится к вычислительным методам предоставляемыми библиотеками. Она ещё про сценарии, использования оных! Вырванные из контекста методы теряют всякий смысл, чему приводятся примеры. Как замок на калитке она вроде-бы и висит, но не факт что что-либо запирает ;-)

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

есть интересное чтиво от одного из авторов своей криптобиблиотеки https://loup-vaillant.fr/articles/rolling-your-own-crypto https://loup-vaillant.fr/articles/implemented-my-own-crypto
спойлер - хотя он разбирается в математике и был уверен что багов нет т.к. реализация занимает меньше тысячи строк, вдумчивые исследователи несколько уязвимостей таки отыскали. Зато теперь она выглядит уж точно понадежнее OpenSSL.

Ну то есть быть уверенным в 100% надежности криптографии - нельзя.

Можно быть уверенным в ненадежности или что может быть работает пока (тем более что дыра может не в самой математике оказаться а где то рядом).

При этом, если у разработчика нет успешного опыта поиска дыр в чужой криптографии - можно быть уверенным что это - первый случай а не второй.

?

100% надежности конечно нет. Может завтра квантовый комп сломает вообще всё. Эти ссылки скорее пример относительно успешного написания "своей криптографии", какой уровень матана нужен и чего ожидать. Сам автор делает вывод, что свою криптографию делать можно, но нельзя делать ее в одиночку. Если ты смог заручится аудитом (т.е. не просто выложил на форум, а кто-то действительно исследовал ее) от тех кто разбирвется в криптографии/умеет ее ломать, то уверенности в ней уже больше. В иначе, как говорится, каждый может придумать криптосистему которую не сможет сломать он сам.

Нет вреднее предрассудка, чем "Не пишите собственной криптографии". Как будто при работе с файловой системой или сетевой библиотекой, например, не допускают ошибок, которые могут привести к взлому системы. Никто же не пытается говорить "Никогда сами не работайте с файлами или сетью!".

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

Так в статье и говорится, что практиковаться и изучать криптографию можно и нужно, не стоит только свои изобретения пускать в продакшен

Сравните с "Изучать работу с сетью можно и нужно, не стоит только свои изобретения пускать в продакшен".

Скажем так - писать свои ФС и сетевые протоколы тоже надо, в том числе и для production, но в большинстве случаев лучше (дешевле, безопаснее и т.д.) использовать то что есть. С криптографией примерно так же.

Исследователи, изобретатели и прочие толкатели прогресса ни кому не нужны. Ведь так?
Зачем летать на Марс, ведь летать в Тайланд "дешевле, безопаснее и т.д."?

Да. как только у вас появится обоснование, почему вам надо именно на Марс, а не в Тайланд - вы сможете обосновать, почему вам нужен самописный криптопротокол, а не готовый.

Я ж не говорю, что вообще не надо. Но для полёта на Марс нужна серьёзная подготовка - как и для написания устойчивой криптографии. Если разбираетесь в теме и создаёте новые протоколы, которые признаёт community - пожалуйста. Если просто работаете над продуктом где понадобиласб криптография - стоит посмотреть, что уже есть.

Ну так а откуда возьмётся серьёзная подготовка, признание community?
Вы так говорите (и статья тоже), что нельзя даже начинать что-то писать не потратив годы на предварительную подготовку.
ИМХО процесс выглядит так:
изучаем теорию - пишем код - анализируем написанное - изучаем теорию - пишем код - ... и так бесконечно.
Мало кто научился чему-то серьёзному не совершив первых робких шагов и не допустив ошибок.

Если бы все сами работали с криптографией, то все имели бы представление о том, как верифицировать собственный протокол или какие типичные ошибки существуют.

К сожалению нет. Есть фундаментальное различие между ошибками функциональности и ошибками безопасности: первые могут быть обнаружены при обычном использовании, и обычно достаточно легко предъявить тест который демонстрирует проблему вне разумных сомнений. Вторые никак не сказываются на нормальной работе ПО (за совсем клиническими исключениями), и даже демонстрирующий уязвимость proof-of-concept вполне можно не понять или убедить себя что проблема несущественна.

Более педантичное правило звучало бы так: реализуйте безопасность всерьёз и с серьёзными затратами или не реализуйте её вовсе, потому что полумеры практически дают результат хуже чем если бы не реализовывали ничего - оно так же небезопасно, но теперь у вас есть ложные иллюзии.

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

Потому, что тебе не известны все требования к безопасности по криптографии (т.к. это сведения ограниченного доступа), и чтобы ты не написал, это с большой долей вероятности будет недостаточно (в силу неизвестности требований).

Бред – если что-то фигурирует в библиотеке, тем более с открытым кодом, то оно секретным не может являться по определению. А на нет и суда нет – вы секретные криптографии использовать не сможете как бы вам и не хотелось.

Это называется security by obscurity и, в общем случае, не может считаться надежным. По крайней мере, на конкурсах шифрования такие решения не рассматриваются.
Пролюбить ключ - совсем не то же, что пролюбить алгоритм, особенно, если ключи менять регулярно.

"Требования к безопасности по криптографии" как раз и не известны массам, потому что всем вдалбливают в голову про "не пишите своей криптографии" первым делом при попытке с этой криптографией познакомиться (я надеюсь Вы не имели в виду мистические сверхсекретные знания "требований к безопасности" всяких фсбшников, простым смертным недоступные? "Ограниченный дрступ" меня смутил)

Это как раз спорное ограничение. Оно иногда играет на руку (как когда АНБ порекомендовало определённые матрицы AESDES, а несколько лет спустя выяснилось что они устойчивы к новому методу атаки), но может играть и против (как неслучайность матриц "Стрибога" наводит людей на подозрения что они выбраны такими не из-за устойчивости, а, напротив, из-за внедрённого бэкдора).

Фундаментально, криптография - это наука об управлении доверием. Одно дело использовать библиотеку, в отношении которой вы доверяете что авторы приложили больше усилий чем можете приложить вы, и заметно другое - полагаться на таинственные рецепты, корректность которых вы в принципе не можете проверить.

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

А необходимости писать свой безопасный протокол почти никогда нет, то есть узкий совет звучит как "не делайте этой ошибки на совсем уж ровном месте".

Почему при этом с придыханием говорят именно о работе с криптографией - непонятно.

Там в корне лежит математика, которая простым смертным недоступна ввиду своей дикой сложности. Потому свое свежеизобретенное криптографическое решение никак невозможно протестировать на стойкость... Примерно тоже самое, что придумывать лекарства без специального медицинского образования - кастомное зелье может и сработает против болезни, но потом у больного рога с копытами отрастут.

А еще товарищ майор не хочет разбираться с вашими кастомными шифрованиями, он и стандартные-то с трудом осиливает /s

Там в корне лежит математика, которая простым смертным недоступна ввиду своей дикой сложности.

Вы за всех не говорите. За себя говорите.

Я отдалённо знаком с алгеброй (ну, той, которая Chapter 0 у Паоло Алюффи — собсна, проботал значимую часть упражнений в этой книге и понимаю

такие шутки целиком

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

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

Потому свое свежеизобретенное криптографическое решение никак невозможно протестировать на стойкость

Если мне не изменяет склероз, доказанной стойкостью обладает только шифр Вернама, а стойкость остальных алгоритмов -- предположительна.

В асимметричной криптографии чуть лучше. К примеру, можно показать что если у нас есть оракул, ломающий Диффи-Хеллмана, то его можно использовать для разложения на множители произвольного числа. (Т.е., конечно, у нас нет хорошего нижнего предела для задачи факторизации, но такая гарантия всё-таки не совсем ничего.)

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

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

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

а можно только обратиться к магу-криптографу.

Настораживает то, сколько софта завязано на алгоритмы Daniel J. Bernstein...

Да ладно? Нет вреднее предрассудка? А скажем "при любой простуде обязательно принимайте антибиотики" не страшнее будет?)

Криптография в среднем на порядок сложнее, чем работа с файловой системой или сетевой библиотекой. Ради интереса, попробуйте указать, не подглядывая в интернете решение, в чём заключается уязвимость в этой программе:

from Crypto.Cipher import AES
from Crypto.Util.Padding import pad,unpad
import os

def encrypt(key, plaintext):
    cipher = AES.new(key, AES.MODE_CTR, nonce=IV)
    return cipher.encrypt(pad(plaintext, 16))

def decrypt(key, ciphertext):
    cipher = AES.new(key, AES.MODE_CTR, nonce=IV)
    return unpad(cipher.decrypt(ciphertext), 16)

def menu():
    print("1. Encrypt Message")
    print("2. Get Flag")
    print("3. Exit")
    choice = int(input(">> "))
    return choice

key = os.urandom(16)
IV = os.urandom(8)

while True:
    choice = menu()
    if choice == 1:
        plaintext = input("Message: ")
        print("Encrypted Message (hex):", encrypt(key, plaintext.encode()).hex())
    elif choice == 2:
        print("Encrypted Message (hex):", encrypt(key, b"COMPFEST16{RETACDED}").hex())
     
    elif choice == 3:
        break
Скрытый текст

Не, ну это слишком просто, такое школьники ломают в восьмом классе...

Я же прав, что

Я же прав, что тут за такими сложными словами как AES.MODE_CTR скрыто банальное шифрование через XOR с длинным случайным, но неизменным ключом?

Вообще нет, шифрование даже 16 байт через AES-CTR со сброшенной длиной не эквивалентно XOR'у. Однако переиспользование IV+key в этом коде есть, и именно на эту уязвимость алгоритма (а не кода) де-факто идет атака в этой задаче. Но надо ещё почитать, как именно запилить эту атаку.

Но ведь AES-CTR - это поточный режим, а поточный шифр - это всегда XOR текста с гаммой?

AES-CBC тоже поточный шифр, и это тоже XOR текста с гаммой. Если поменять в задаче выше AES-CTR на AES-CBC, что-то поменяется?

Неправда, CBC - не поточный режим. Там не простой XOR с гаммой а именно chaining, т.е. следующие блоки будут зависеть от предыдущих.

Да, я тут плохо написал. Смысл - станет ли в питон скрипте хорошо, если заменить AES-CTR на AES-CBC, и почему именно. Но вы, судя по замечанию, эту причину понимаете :)

Если бы все сами работали с криптографией, то все имели бы представление о том, как верифицировать собственный протокол или какие типичные ошибки существуют.

Ага. А если бы все сами работали с выделением/освобождением памяти , то все имели бы представление, о том, как верифицировать свой код и избегать NPE, Use-after-Free и тому подобных проблем

Если вам хочется пример некриптографических граблей, то "никогда не обрабатывайте сами юникод". Желающие опробовать прочность лба могут написать что-нибудь простенькое, типа самостоятельного подсчёта количества символов в UTF-8 строке.

Вот прямо так и хочется у автора поинтересоватсья — что условному агентству из трёх букв, первая Ф, проще взломать: нечто, зашифрованное широко известной библиотекой, которая у всех одинаковая, или какой-то самописной реализацией, которых вокруг 100500? Нет, понятно, что самописку взломать можно не за 10^100 лет, а на много порядков быстрее — но если всё равно получается число Дохуа — то так ли уж это принципиально?

Самописную реализацию хакнуть проще: если это опенсорс, если это легко дизассемблировать (скорее да чем нет), если автор этого доступен для терморектального криптоанализа. Лушче всё же взять широко известную библиотеку

даже если опенсорс и лежит на гитхабе - это ж надо поднять попу и попытаться понять чужой код, для чего нужно как-то простимулировать читальщика и понимальщика чужого кода

Терморектальный криптоанализ ломает всё: самые надежные, не-самописные реализации чего угодно, и широко известные библиотеки в том числе.

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

сколько было найдено уязвимостей ну скажем в libsodium? Насколько легко было бы использовать их для взлома?

сколько было найдено уязвимостей ну скажем в libsodium

Сколько было найдено уязвимостей ну, скажем, в коде Васи Пупкина? Ах, Вы ни разу не видели кода Васи Пупкина? Ну так это Ваша проблема, нас она не касается. Вы не отвлекайтесь, ищите!

у Васи (1209) нашли пару уязвимостей прямо тут в комментах, еще не видя кода.

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

Зависит от сложности (качества) самодельного решения. Самодельный S-box с уникальными случайными перестановками (A->B, B->G, C->Z, ...) может казаться разработчику охренеть каким простым, эффективным и надежным. Но его взлом - уровень лабораторной работы.
Другие, более сложные методы - тоже имеют причины (методы атаки), по которым от них отказались.
Беда самописной криптографии не в уполовиненном Дохуа, а в том, что разработчик сам не компетентен и не может квалифицированно оценить его "криптостойкость". Ему-то кажется что Дохуа или даже тройной Дохуа (но как пессимист и скептик, он допускает, что всего лишь 1% от Дохуа). А по факту это - 20 минут на взлом.

Или (но тут я повторю мысль из статьи) - алгоритм не так уж и плох, но разраб ошибся в какой-то неожиданной мелочи (например, инициализировал свой PRNG из time() как в школе учили). И вот пароль юзера Wesha из 27 символов в котором есть цифры-буквы-эмодзи-иероглифы и даже соло на саксофоне - он имеет не хреналлион комбинаций и даже не пол хреналлиона, а всего лишь 86400, потому что все знают, что он с нами с 18 сентября 2015.

А по факту это - 20 минут на взлом

Но речь-то как раз о том, что этот факт надо для начала узнать — а это денег (в смысле времени = зарплаты высококвалифицированных специалистов) стОит.

Поэтому лучше считать, что если вы не взяли стандартную реализацию типа https, что ваша реализация это 20 минут на взлом.

Лучше вообще считать, что Злобная Гебня Знает Всё, но на практике оно так очень-очень не всегда.

Если не сложно, можете объяснить каким образом получается именно 86400 комбинации? Меня не учили инициализировать PRNG из даты, никогда так не делал, поэтому не знаю в чём прикол.

Дяденька просто взял первое вспомнившееся число. Любой более-менее приличный не-AIшный программист в курсе, что это число секунд в сутках.

> (например, инициализировал свой PRNG из time() как в школе учили)

Но дату-то мы знаем, то самое 18 сентября. А раз мы знаем дату, когда был вызван time() - у нас остаётся всего 86400 вариантов, в какую именно секунду его вызвали.

Если там unixtime - то оно по определению в секундах.

А вот на винде обычно используются миллисекунды с момента включения, их угадать сложнее (но для пароля всё равно слабо).

Спасибо, наконец то догнал откуда ноги растут.

А вот зачем использовать такие плохие генераторы, так и не догнал. Выглядит как какая-то дичь. Что тогда туда передавать то, захардкоженое число огромного размера что-ли? Или числа одного генератора пускать в другой, что тоже выглядит странно.

А у криптостойких генераторов тоже такой прикол с инициализацией?

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

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

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

Меня не учили инициализировать PRNG из даты

Вероятно, потому что вы пишете на языке, где такая инициализация идёт просто по умолчанию (хотя обычно используется немного другой таймер). Прикол в том, что генераторы псевдослучайных числе обычно детерминированы, и при их использовании не может получиться больше различных последовательностей чем было подано на вход. И если на входе было 86 400 возможных значений системного времени - то и возможных случайных паролей можно сгенерировать лишь 86 400.

Чтобы этого избежать, нужно использовать либо недетерминированные генераторы псевдослучайных чисел, где в состояние генератора регулярно подмешивается энтропия; либо просто глобальный общесистемный генератор, который был инициализирован хрен знает когда и генерировал числа хрен знает сколько раз. А, ну ещё безопасный генератор должен быть криптостойким для защиты от некоторых других атак.

такая инициализация идёт просто по умолчанию

Возможно так и есть, в учебном заведении использовал pascal, basic, C#. А сейчас работаю на 1С. Вообще не помню, чтобы в генератор нужно было что-то передавать, кроме параметров для определения множества чисел, которые он будет рандомить.

где в состояние генератора регулярно подмешивается энтропия

А вот это видел и не раз, всякие там покрути мышкой или понажимай кнопки, при создании контейнера для ЭЦП.

На Паскале и Бейсике генератор псевдослучайных чисел в инициализации нуждается, должны были научить его инициализировать (если вообще про него хоть что-то рассказывали). На C# так вообще можно любое число генераторов создать (и самая популярная ошибка новичка - создавать новый генератор каждый раз когда понадобится случайное число).

Насколько старый Бейсик вы учили? Не помните случайно конструкцию "RANDOMIZE TIMER"?

На паскале инициализировал его, но не помню, чтобы туда что-то передавалось при этом, вроде метод без параметров.

На бейсике вообще не помню чтобы пользовались рандомайзером, может быть его там и не было, потому-что это был Visual Basic в Excel 2007 - 2013.

На C# создавал 1 раз, а потом получал числа. Вроде бы про это сразу препод сказал.

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

На паскале инициализировал его, но не помню, чтобы туда что-то передавалось при этом, вроде метод без параметров.

Потому что, как сказали выше, по умолчанию он берет текущее время в качестве параметра.

А вот в C, например, srand() явно принимает на вход параметр типа unsigned int, который используется для инициализации генератора.

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

Если в вашем гипотетическом случае предполагается, что неизвестностью самописной реализации улучшается ее защищенность, то это нарушает принцип Керкгоффса.

Так то оно так, но вот прямо сейчас в этом обсуждении есть много людей, которые почему-то считают, что «Security through obscurity» это хорошая практика, которая увеличивает безопасность.

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

А если сделать двойное шифрование, (сначала самописным кодом, а поверх уже общеизвестной библиотекой), то хакер -самоучка отсеется, а агенство получит лишнюю головную боль. Это же самый очевидный вариант, win-win.

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

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

«От меня не требуется создавать принципиально невзламываемую систему. Мне достаточно создать систему, которую не сможет взломать тот, кого назначат расследовать моё дело.»

(Джим Санборн смотрит на этих ваших профессионалов, ехидно посмеиваясь.)

'..По причине того что Санборн не имел достаточных знаний о криптографии, он обратился за помощью к Эду Шейдту, который незадолго до этого закончил свою деятельность как глава криптографического центра ЦРУ..'

отличная Тема! и мои пять копеек :)

если автор доступен для терморектального криптоанализа

вот! это ГЛАВНОЕ.
и не важно на все остальное, если можно давить гражданина.

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

смиялсо.

а вот вам цитата Серьезного Безопасника из 90х годов: ЛЮБОЕ минимальное шифрование ВСЕГДА лучше ограничения прав доступа! ваш текст не должен СРАЗУ читаться. точка.

но сначала поговорим про ГОСТы ;)
ГОСТ — это аббревиатура от словосочетания «государственный стандарт». он есть в любом государстве. и в любом государстве вас ЗАСТАВЯТ его использовать!

почему?

ну, прежде всего нужно четко себе представлять, что весь Мир сейчас жестоко разделен на дружественные и вражественные юрисдикции:

  1. вражеские государства вас заставят использовать ГОСТ, потому что всегда смогут вскрыть все шифровки. они это используют для продвижения терроризма, наркомании и детской порнографии!

  2. дружеские государства вас заставят использовать ГОСТ, потому что всегда смогут вскрыть все шифровки. они это используют для защиты от терроризма, наркомании и детской порнографии!

не перепутайте!

и что же крестьянину делать?
2. обязательно использовать ГОСТ страны пребывания. это Закон!

1. но перед этим шифровать свои данные любым доступным способом.

да, есть подвох.
сразу после вашего наивного шифрования (но перед ГОСТом) его нужно чуточку исказить:

  • переставить немножко байтики

  • что-то заксорить во имя тёщи

  • в общем, любое дилетантское искажение, делающее невозможным АВТОМАТИЧЕСКОЕ декодирование "всем известного" наивного шифрования...

вы тем самым поможете Злым человекам стать немножко Добрее.

Справедливости ради, необходимость и обязательность использования государственных стандартов регулиируется законодательством о стандартизации. В России, например, за некоторыми исключениями использовать ГОСТы не обязательно. Например, ядерный реактор надо обязательно строить по профильным ГОСТам, а вот писать пояснительную записку к вузовской выпускной квалификационной работе, в принципе, по ГОСТу не обязательно, и вузу никто не запретит утвердить какие-то другие требования к её оформлению.

а вот писать пояснительную записку к вузовской выпускной квалификационной работе, в принципе, по ГОСТу не обязательно,

Ну, может где-то не слишком строго соблюдают.. Но обязательно. Вам ведь диплом выдадут стандартный, и квалификационная работа тоже должна быть выполнена с выполнением стандартов.

Применение гостов дело добровольное. Ну вот если у вас есть госзаказчик который требует делать по ГОСТу, то делайте. Обязательными для всех являются технические регламенты, их дума принимает, это законы. Регламента на шифрование нет.

Хотя погодите, регламенты кажется распространяются только на продукцию обращаюся на территории ЕАЭС. Для себя или забесплатно можно что угодно.

Когда-нибудь те, кто пишут статьи про крипту, перестанут путать дешуфровку и расшифровку. А что такое ключ дешифровки?

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

Проблема не в том, что разработчик не знает какому ключу можно доверять, а какому нет. Проблема в том, что разработчик не задумался над вопросом: "Откуда я знаю, что ключу можно доверять?" И не записал ответ в документацию. Потому что 100%-ой гарантии не бывает, а ограничения системы должны быть задокументированы

У большинства людей нет фундаментального понимания того, что же такое реализация собственной криптографии.

Это потому что начиная с главных - техдир больше астроном чем итишник, и команду себе подбирает соответствующую.

У меня был случай мне присылали json с логином зашифрованным паролем (симметричный алг) и рядом еще ключ расшифровки, типа никто не догадается.

Одним словом астрономы.

обычно, никто нахрен не полезет ломать вашу криптосистему, ибо видно что там заморочено, и мало ли как оно там...время ток терять.....надеяться что идиоты зашифровали все для вида - можно , но только если очень надо, времени разбираться много, и если что ну не срослось, ладно )) проще мож договориться и купить пароль чей-то

обычно, никто нахрен не полезет ломать вашу криптосистему

если она никому не нужна

В далёких 2000-х кейгены были к каждой более-менее полезной программе. (по факту, это реверс -инжиниринг самодельных криптосистем)

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

Та же приблизительно. Есть какие-то входные данные (ключ для запуска) , есть некий дешифратор. Задача - сделать шифратор для этой схемы. И чтобы с 1-битной музыкой :)

никто нахрен не полезет ломать вашу криптосистему, ибо видно что там заморочено, и мало ли как оно там...время ток терять.....

Security through obscurity не работает. Если ваша кустарная "криптосистема" для кого-то представляет интерес и имеет уязвимости, её сломают, может быть не быстрее чем вы моргнёте глазом, но весьма быстро.

для симметричного шыфра - нет ничо надёжнее стандартного хоr-а с любой стандартной хеш-функцией от пароля. для асиметричного есть куча бибоиотек элиптички и rsa. Вопрос в том, что может умельцы вместо рандомных параметров какие-то пресеты заюзанные и уже взломанные захотят использовать ...но там где это важно - это маловероятно, а там где неважно - никто даже отладчик запускать не будет чтоб понять, чем вы там что и как шифруете....

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

Вот про таких как вы и статья. "Нет ничего надёжнее", ну-ну...

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

Или же, если вы так шифруете переписку, можно предположить что сообщение из 6 символов будет словом "привет".

А поскольку она у вас периодическая

Дак следующий блок ксорить с хешем хеша и так далее :)

Тогда так бы и было сказано. Но про второе применение хеш-функции ничего не написано.

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

а если (по условию) всегда всем легко известен номер (uid) записи от расшифрованного сообщения - да не вопрос, добавьте его в конкатенацию к паролю перед хешированием....

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

Сильно короткие у вас какие-то сообщения. Даже в твиттере ограничение было 280 символов, а самая длинная из стандартных хеш-функций даёт лишь 64 байта.

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

Вы недооцениваете производительность современных компьютеров.

да лан 64... тигеры, хавалы там всякие, они и по 256 байт длину поддерживают , 128 уж точно... потом их можно одну за другой использовать, а их там штук 10 массово библиотечных минимум )

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

Ну, это работать будет (пока оригинал не утечёт), но можно намного проще и с одной-единственной функцией.

ксорим два зашифрованных сообщения и какой бы ни был длинный ключ он обнуляется.

есть трюк еще красивее - можно поксорить друг с другом два зашифрованных сообщения. Тогда хеш функция обнулится и у злоумышленника будет xor от двух незашифрованных сообщений. Ну а его уже расшифровать довольно легко.

например, каг? ну единсное что я понял что ксор это как красная тряпка для любителей чо-нить порасшифровать )))

одинаковым в обеих записях, но сами символы при этом неизвестны (и разные ).... это все хорошо для умнссых упражнений, на практике никому нафиг не надо обычно ...от (для) начальства зашифровать можно и просто ксором с паролем без всякой хеши, ломается правда легко совсем, но кто этим будет заниматься, и зачем....

кто этим будет заниматься, и зачем..

Если ваша система никому не интересна - то конечно же никто не будет ее ломать. Но тогда зачем вы ее делали?

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

кто-то платит денги за её взлом

Есть просто любители, которые могут, и им это интересно.

вы даже код программный не увидите

Смелое допущение. Никогда такого не было, чтобы хакеры получили куда-то доступ и слили 100500 Гб файлов.

через ваш любимый ксор поля бд зашифрованы...

Если там всё зашифровано xor одним ключом, в том числе и автоинкрементные поля - это уровень студенческой лабораторной работы.

нет ничо надёжнее стандартного хоr-а с любой стандартной хеш-функцией от пароля

радужные таблицы: существуют, например.

нет ничего надёжнее одноразового шифроблокнота.

нет ничего надёжнее одноразового шифроблокнота.

…при использовании генератора истинно случайных чисел для его составления.

Однако защищённые данные могут потерять актуальность быстрее, чем они моргают.

Однако защищённые данные могут потерять актуальность быстрее, чем они моргают глазом!

Автор так коряво сформулировал свои мысли, что за деревьями не видно леса. Да, криптография это сложно, да, чем ближе к проду и чем ценнее данные, тем меньше должно быть самоделок и больше известных и широко проверенных решений. И дело здесь не в магии, а в гигантских трудозатратах, уже потраченных на исследования безопасности стандартных алгоритмов и систем.

Можно ли делать свой аналог HTTPS для изучения? Почему нет, если вам интересно поковыряться в низкоуровневых деталях. Можно ли свою поделку использовать в боевом банковском приложении - однозначно нет. У каждого решения есть границы применимости.

автор коряво сформулировал мысли, но тут есть еще и другой лес:

1) если вы делаете МВП или демку, или петпроект, у которого будет 10 пользователей и недорогие данные внутри - то используйте любую криптографию. Можно даже попробовать свою.

Потому что вы - "неуловимый джо".

2) если у вас больше 10к пользователей, или данные дороже 10к денег - то подумайте над тем, чтобы завести отдельного человека (или обучите себя и регулярно занимайтесь этим), который упорядочит вам защиту (и криптографию).

Потому что вас начнут пытаться взломатью Просто потому что скучно, а у вас АПИ лежит в открытом доступе с "админ/админ" или назначает айдишки по порядку.

3) если у вас больше 100к пользователей (или данные 100к+ денег) - то у вас должен быть отдел безопасников и "правильная криптография".

Потому что попытки взлома будут частью жизни (если мониторинг показывает что их 0 - значит сервер упал), а успешные взломы (обнаружили уязвимость железа и тд) - неудивительным событием ...

---

и если использовать софт из п1 в ситуации п3 ("о чём мечтают стартаперы") - это немного опрометчиво :)

У вас устаревшие сведения, попытки взлома являются частью жизни даже у "неуловимых джо". Сейчас любой VDS с открытыми 80 и 443 портами сканируется ботами на уязвимости wordpress ежедневно. А уж на 22й порт стучатся и вовсе 24/7.

если использовать софт из п1 в ситуации п3 ("о чём мечтают стартаперы") - это немного опрометчиво :)

Обычно так и происходит..., до первого факапа. Потому что устранение технического долга - это скучно, не модно и вообще не увеличивает капитализацию. Хорошо, если в процессе в команде появятся грамотные специалисты по ИБ и по администрированию, которым по статусу положено заниматься скучными вопросами. Тогда успеют грамотно перескочить из 1 в 3.

Буквально, месяц назад написал на VBScript примитивную прогу по обфускации фраз с использованием RND и выложил на всеобщее осуждение. Хорошо, что я у многих экспертов в блэклисте. Но один комментарий по поводу инициализации RND был, и я добавил комменты в код. Но я, видимо, не Ад для других, поскольку, не уверен в себе. )
А тему, да, надо поднимать чаще.
Блин, это перевод.

Выбрать синий цвет одновременно для заголовков и для ключевых слов в тексте было плохим решением, аж глаза болят. А когда следом идут ещё и текстовые гиперссылки, которые тоже синие, но другого тона, становится совсем больно. Это небольшое отступление по дизайну, не знаю зачем так издеваться над читателями.
А статья годная, правда посыл "Изучайте, а потом делайте" можно не нарочно интерпретировать как "Не делайте защиту сами вовсе". Вообще больная тема многих проектов, особенно где нет аудита по безопасности и её делают программисты без нужных знаний.

Просто оставлю здесь ссылку на эти комментарии Николая Дурова - автора MTProto к статье с найденной уязвимостью в их протоколе.

Тут конечно возникают вопросы, может ли столь компетентный человек проглядеть такую дыру или же он не заметил её специально. Но вот просто очень хороший пример того как стреляет "кустарная" криптография.

(да, я всё же считаю, что это была закладка (-: )

Не реализуйте собственную систему безопасности

А что бы проверить не утекли ли данные вашей карты введите ее номер cvc код в поле ниже.

очень жаль, что никто не читает ссылки...

https://loup-vaillant.fr/articles/implemented-my-own-crypto

There’s something worrying about this bug: I was the first to discover it, in January 2017. According to Khovratovich himself, it was two years old. Now I understand why the authors themselves didn’t find it: unlike me, they didn’t have a reference implementation to compare to.

What I don’t understand is, how come nobody else ? If you implement Argon2 from spec, you cannot miss it. Test vectors won’t match, and searching for the cause will naturally lead to this bug. I can draw only one conclusion from this:

I’m the first to independently re-implement Argon2.

This “never implement your own crypto” business went a little too far.

перевожу для ленивых:

НИКТО В МИРЕ не discovered and reported this bug!
Подход «никогда не пишите собственную криптографию» уже дошел до органов приседания.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий