Поискав в интернете, побеседовав с ИИ, можно выделить bullet-proof технологию многофакторной авторизации. "Добавь TOTP и спи спокойно", говорят они. Но что, если у вас только одно устройство, и оно скомпрометировано? Например, вы едете в путешествие и берёте с собой только телефон. Можете ли вы доверять вашему телефону? Можете ли вы с него ввести пароль и с него же сгенерировать TOTP?
Мне показалось, что собственному телефону я верить не могу (особенно после того, как удалив приложение одной нехорошей соцсети, через пару недель я обнаружил, что приложение снова установлено). Я задался вопросом безопасной авторизации на скомпрометированном устройстве.
В голову сразу пришла идея шифрования в уме: авторизатор выдаёт вам контрольное слово, вы в уме его шифруете алгоритмом, который знаете только вы и авторизатор, и в качестве пароля вписываете результат шифрования (или хэширования). Но можно ли шифровать в уме?
Простые алгоритмы шифрования
Шифр Цезаря. Ключ - это число. Суть - сдвиг каждой буквы слова на число из ключа по алфавиту. Шифровать в уме - вполне реально, надо только помнить алфавит. Но надёжности здесь практически нет. Любой аналитик раскусит алгоритм моментально. (подробнее тут)
Шифр Виженера. Это прокачанный Цезарь, в котором вместо ключа из 1 числа используется ключ из последовательности чисел. Например, первую букву сдвигаем на 2 символа, вторую на 8, третью на 1, и дальше по кругу. Если у Цезаря, подставляя одни и те же буквы, будем получать одни и те же буквы шифра (например, любая буква "А" в любом месте всегда будет буквой "Г"), то в случае Виженера шифр становится не таким очевидным. (подробнее тут)
Шифр Плейфера. Не хочу углубляться в суть этого метода, просто скажу, что для его использования необходимо запомнить максимально длинную ключевую фразу из неповторяющихся букв и запомнить оставшиеся в алфавите буквы. Причём запомнить это в виде матрицы 5 на 5. Фишка этого метода в том, что шифруются не буквы за буквой, а пары букв. В итоге, частотному анализу придётся собирать данные не для 25 букв, а для 25x25=625 пар букв. Но... шифровать в уме по такому алгоритму будет крайне некомфортно. (подробнее тут)
Остальные рассматриваемые мной алгоритмы становились только сложнее, от чего я решил бросить это дело и подумать над изобретением собственного велосипеда.
Собственный алгоритм
За основу я решил взять Виженера
Вместо алфавита я решил взять случайную последовательность букв (вместо "АБВГ", "ВАГБ")
Чтобы проще было запомнить эту последовательность букв, я решил взять обычный текст и в нём использовать первое упоминание нужной буквы. (такая схема не позволит нормально дешифровать текст, но оно нам и не надо. Другими словами, с этого этапа мы не шифруем, а хэшируем)
Чтобы защититься от тупых частотных анализаторов, ключом будет являться самая новая статья на Habr
Чтобы окончательно поломать любую адекватную аналитику, добавляем зависимость со второй по свежести статьёй.
Пример
Итак, нам надо зашифровать слово "pass", которое выдал нам сервер.
Ключ Виженера - пин-код от текущей банковской карты - 6113.
Текст первой статьи:
Привет! За клавиатурой Влад Калашников, Senior Product Designer в стартапе Re:Luna, до этого работал в МТС и Pinkman. 6 лет занимаюсь дизайном и 4 года продуктовом. Недавно в своем телеграм-канале писал о том, как я сделал портфолио во Framer. Решил написать чуть более расширенную мини-статью на эту тему с картинками.
Текст второй статьи:
Привет, Хабр! Меня зовут Дарья Фролова. Я редактор в МТС Диджитал, а еще — родитель, который старается подбрасывать детям полезный контент получается не всегда.
Ищем в статье первое упоминание каждой буквы, в первой статье, сдвигаем всё на числа из пин-кода, полученную букву ищем во второй статье и сдвигаем ещё раз.
Итак:
Pass
П со сдвигом в 6 в первой статье превращается в З.
З со сдвигом в 6 во второй статье превращается в А.
pAss
А со сдвигом в 1 в первой статье превращается в К.
К со сдвигом в 1 во второй статье превращается в Т.
paSs
С со сдвигом в 1 в первой статье превращается в Т.
Т со сдвигом в 1 во второй статье превращается в Х.
pasS
С со сдвигом в 3 в первой статье превращается в Р.
Р со сдвигом в 3 во второй статье превращается в Е.
Так проделываем с каждой буквой и получаем: ATHE (латиницей).
То же самое проделывает и наш сервер авторизации, и если шифровка совпадает, впускает нас.
Чтобы наш пароль не ввели сразу через секунду после нас, превращаем его в OTP и вычёркиваем из списка. Чтобы войти повторно, берём самую актуальную статью из тех, которые ещё не использовали. Думаю, в рамках частоты обновления статей, у нас в памяти будут оставаться статьи, которые мы уже использовали.
И после всего этого ещё остаётся огромный потенциал для творчества по улучшению алгоритма, например:
время публикации статьи в перемешку с пин-кодом в качестве ключа
ротация разных новостных порталовучитывание знаков препинания
персонифицированное преобразование кириллицы в латиницу (например, буква "Ю" может быть превращена в "yu", может в "u", а может в "1-0", как придумаете)
использовать TOTP с длинным временным интервалом вместо пина
Заключение
Думаю, подобная штука может помочь для авторизации на скомпрометированном девайсе, но также предполагаю, что использование такой штуки примерно настолько же неадекватно, как ношение шапки из фольги. Тем не менее, размышления над подобным алгоритмом мне показались забавными и достойными публикации.
Комментарии (24)
Shaman_RSHU
31.07.2024 17:54Мне показалось, что собственному телефону я верить не могу (особенно
после того, как удалив приложение одной нехорошей соцсети, через пару
недель я обнаружил, что приложение снова установлено).Apple/Google?
вы в уме его шифруете алгоритмом, который знаете только вы и авторизатор
Постулат: отсутствие информации об алгоритме шифрования не повышает его критостойкость
Да, забавно :)
aleksejs1 Автор
31.07.2024 17:54Apple/Google?
Google
Постулат: отсутствие информации об алгоритме шифрования не повышает его критостойкость
Если речь идёт о шифровании, то да. Но в данном случае в конечном варианте идеи - хэширование. А в центре внимания - не шифровка данных, а авторизация. Если авторизироваться не так часто, то у второй стороны не соберётся достаточно данных для реверс инженеринга. А попытки брутфорса приведут к блокировки.
Но вообще, я с вами согласен, потому и опубликовал статью (раскрыл алгоритм) :)
sekuzmin
31.07.2024 17:54особенно после того, как удалив приложение одной нехорошей соцсети, через пару недель я обнаружил, что приложение снова установлено
Телефон видимо китаец на андроиде?
Идея напомнила другую статью на Хабре, где автор «шифровал» пин код и записывал его на банковской карте.
xSVPx
31.07.2024 17:54Ну записать на карте неправильный код - это неплохая в целом идея.
Но если не можешь запомнить четыре цифры....
d2d8
31.07.2024 17:54+33-4 символьный код сейчас реально используется для авторизации в цифровых системах на линии фронта. Шанс того, что боец после обстрелов не сможет его вспомнить весьма велик. Много кто просто его пишет на рабочем устройстве чем умножает на ноль всю безопасность. Так что идея с простым модификатором (+-1 например) весьма применима и полезна в реальной жизни.
xSVPx
31.07.2024 17:54Мы всё-таки более мирные кейсы обсуждаем. В ситуации предельного стресса ты и про +1 можешь забыть, и даже не смочь эту операцию в уме провести...
Если пин писать на устройстве, то безусловно как-то его изменив, настоящий пин писать точно не надо, если устройство может попасть не в те руки.
Kil1J0y
31.07.2024 17:54+2Не понял. Зачем вообще вводить пароль ?
Используем токен MFA или SSL авторизацию, ключ на токене не извлекаемый
aleksejs1 Автор
31.07.2024 17:54Да, токен MFA - это саое безопастное и удобное решение.
Зачем тогда придумывать всё это? - что бы избавиться от зависимостей. Токен надо тоскать с собой. Токен не везде можно подключить (например в публичных компах, где в целях безопасности отключен USB). Токен можно забыть или потерять. Токен можно украсть, после того, как кейлоггер запишет ваш пин :D В общем, шапка из фальги нужна...
alpet_m
31.07.2024 17:54Если телефон не рутован, не все виды компроментации наверное опасны для TOTP-приложений. Однако единственный правильный подход, при обнаружении несанкционированных установок, это сброс к заводским настройкам и тотальное обновление паролей
aleksejs1 Автор
31.07.2024 17:54Я слукавил, сказав, что "удалил приложение". Это предустановленное приложение. Телефон не рутованный и удалить его нельзя, можно только "отключить". Спрос к заводским настройкам, наоборот, включит и установит это приложение. И вероятно, эта несанкционированная установка - какая-то ошибка какого-нибудь менеджера приложений, которое, не знаю... включила приложение? :D
Просто, чем больше я копаюсь в интернет-безопасности, чем больше читаю о приватности, тем больше осознаю, что "безопасных" устройств нет.
Тем более, продвинутый шпионский софт, явно не будет заниматься такой ерундой, как установкой приложения социальной сети.
Squoworode
31.07.2024 17:54ключом будет являться самая новая статья на Habr
Что делать, если в это время кто-то начнёт постить свои 80 статей?
aleksejs1 Автор
31.07.2024 17:54Тоже об этом думал. Предположил, что можно внедрить что-то вроде временного кэша. Т.е. авторизоваться можно по любой статье за последние 5 минут. Но вообще, это проблема, если использовать блокировку при 2-3 неправильных вводах.
IZh
31.07.2024 17:54Всё зависит от модели угроз.
Если устройство взломано, то проще всего хакерам будет подождать, пока вы сами авторизуетесь.
Опять-таки, если атакующие уже на устройстве, они будут видеть весь ваш трафик (и все нажатия на кнопки). Вас устроит такой вариант, что, да, авторизоваться можете только вы, но все ваши действия будут видны атакующим?
А если атакуют снаружи путём перехвата трафика, а устройство таки не взломано, то можно и обычный OTP. Ну, или сделать попроще схему с одноразовыми словами из какого-нибудь текста, который знаете только вы. Снаружи же не будет видно, что вы отправляете серверу, если устройство не взломано.
IZh
31.07.2024 17:54А сейчас вы зависите от Хабра, который в нужную минуту может быть и недоступен, либо в выбранной статье может не оказаться нужной буквы и т.д.
aleksejs1 Автор
31.07.2024 17:54Ну да, суть кейса именно в том, чтобы авторизоваться через взломанное устройство в неизвестной для нас сети. Кейс такой, что хакеры видят и трафик, и нажатия, и клипборд, и вообще всё, что только можно (включая видео с вебки, и видео с камер видеонаблюдения в помещении, где вы используете устройство.
При этом, после авторизации нам надо либо прочитать какие-то данные, которые нам нужны в данную минуту, либо отправить куда-то какие-то данные. Да, хакеры смогут прочетать тот кусок, который мы будем читать, но не смогут прочитать остальные данные. Да, хакеры смогут увидеть данные, которые мы отправляем, но они не смогут сами отправлять данные от нашего лица без нашего ведома.
Пример из реальной жизни - поход на вершину горы, где вы не берёте с собой ничего лишнего, что бы выжить, но пользуетесь общественными девайсами в точках лагерей. Другой пример, - путешествие на коробле, через море, где выход в интернет строго контролируется. Хотя, по сули, в обоих случаях можно иметь при себе физический TOTP токен, который весит всего пару грам.
В схеме с одноразовым словарём из какого-нибудь текста, меня смущает 2 вещи:
надо помнить какие слова уже использовались, а какие ещё нет
после 5-ой авторизации, слов может быть достаточно, что бы найти исходный текст
На случай, если Хабр недоступен глобально, сервер тоже это увидет, и может переключиться на другой резервный портал. Если же, серверу Хабр доступен, а вам - нет, то тут сложнее.
IZh
31.07.2024 17:54+1А почему хакеры не смогут отправлять? Если речь именно про авторизацию, а не систему запрос-ответ, где на каждый запрос требуется подтверждение, то после первой же авторизации сервер пришлёт в ответ некий токен или сессионные cookie, с которыми можно слать последующие запросы. Вот это атакующие и перехватят, дождавшись, когда вы сами авторизуетесь.
aleksejs1 Автор
31.07.2024 17:54Хм... да... смогут. Причём, в теории, в момент получения куки или токена, они могут отключить меня от интернета, и я даже не смогу сделать logout...
Пожалуй да, тут всё зависит от модели угроз. От чего-то может это и поможет, но вероятно затраты усилий не окупятся
jorgvonfrundsberg
31.07.2024 17:54Интересная картинка, однако - пароль и паяльник. Что, казалось бы, общего между ними )))
xSVPx
Тотр всегда должен быть в отдельном аппаратном, доверенном устройстве....
Как еще то ?
aleksejs1 Автор
Ну... в реальной жизни TOTP на отдельном девайсе встречается крайне редко. Аппаратные ключи почаще. Но массовый кейс использования - это TOTP на телефоне. И при этом люди носят с собой только 1 телефон, и при этом на телефоне авторизируются, нарушая многофакторность.
Статья - просто мысли в слух, о том, какая могла бы быть альтернатива.
xSVPx
Но ведь описанное вами - безумие.
Ну т.е. это противоречит буквально всему :), люди игнорируют все правила безопасности.
Альтернатива: нормально делай - нормально будет(на самом деле всё равно не будет :(, т.к. реальной 2фа авторизации нигде уже почти нету). Носи уже отдельное устройство с паролями и тотр, оно занимает совершенно немного места. В принципе старый мобильник можно приспособить, если хочется экономии.
aleksejs1 Автор
Безумие :) Я даже в заключении сравниваю это дело с шапкой из фольги.
Вдохновлением на эти размышления мене послужил Путин, у которого нет девайсов.
Мне стало интересно, а может ли обычный человек не иметь девайсов, при этом иметь онлайн приватность, получая к ней доступ через публичные устройства.
Будто хиппи, живущий в лесу и питающийся солнцем и улыбками, который в любой момент может в халате придти в библиотеку, сесть за публичный компьютер и оплатить налог за собственную землю.