Одиночество и паранойя могут быть прекрасным творческим материалом.
Энн Ламотт
Каждый из нас проходит несколько стадий
Для начала взглянем на ситуацию в общем. Есть ресурс, который можно идентифицировать. Например, веб-ресурс идентифицирется по схеме, хосту и порту, например
https://login.awesome.site.com/
, в свою очередь десктопное приложение может быть идентифицировано по имени исполняемого файла, например awesom-app.exe
или по заголовку окна или его части. Итак с идентификатором разобрались. Далее идут логин и пароль. Логином может служить как имя пользователся, так и адрес его электронной почты, что бы идентифицировать пользователя. А теперь давайте взглянем на пароль, но с другой стороны. Пароль — это своего рода соль (salt) нулевого уровня для генерации хеша. Например:hash(username + ':' + password + ':' + salt)
Отсюда можно выдвинуть идею о количестве солей в хеш-функции: чем больше — тем лучше. Можно взять размер конечного пароля, время (час, день, месяц или даже год) и до кучи географические широту и долготу какой-либо точки на земле. Следовательно, требования к сложности входящего пароля падают и вместо него можно использовать более простую последовательность символов, например из четырех цифр (не рекомендуется с уровнем паранойи 2 и выше).
А теперь, давайте взлянем, что можно с этим всем сделать. Для экспериментов я выбрал Google Chrome и написал для него простое расширение. По клику на иконке появляется окно генерации паролей, расширение получает адрес активной вкладки.
chrome.tabs.query({active: true, currentWindow: true}, tabs => generate(tabs[0].url) );
Затем создаем JavaScript объект
URL
и массив параметров для генерации хэша. Берём именно url.origin
, что бы иметь схему, хост и порт:const username = 'username';
const pin= '1234';
const size = 16;
const expired = 2016;
const latitude = 40.771426;
const longitude = -73.9771395;
function generate(url) {
const url = new URL(url);
const params = [ url.origin, username, pin, size, expired, latitude, longitude ];
const hash = sha512(params.join(':'));
const password = Base85(hash).slice(-size);
document.getElementById('password').value = password;
}
Где функция sha512 — генерирует хэши алгоритмом sha512, а функция Base85 — преобразует шестнадцатеричную систему счисления в восьмидесятиричную формата [A-Za-z0-9]+ и 25 пунктуационных символов обязательно включая пунктуационные символы, таким образом, что отображение функции generate является сюръективным, а пароль получается персистентным (постоянным для одинаковых аргументов функции) и тяжело воспроизводимым.
На данный момент расширение выглядит вот так:
А сами пароли от сайтов нигде не хранятся и моя паранойа пока спит спокойно.
P.S. Если есть идеи как можно усовершенствовать эту идею, буду рад увидеть в коментариях.
P.P.S. Опечатки и ошибки пожалуйста в ЛС.
P.P.P.S. Дабы упредить вопросы о сложности расшифровки, предположим что мой ник и pin 1234 использовались для генерации пароля, хотя давайте предположим, что пин вы не знаете. Тогда какой у меня пароль?
P.P.P.P.S. Только заметил, что в таком случае, фишинговые сайты в пролете на мой пароль
UPD:
Схема генерации:
Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.
Комментарии (40)
mapron
21.02.2016 07:49+7По-моему, это security through obscurity. Нужно исходить из того, что злоумышленнику известно о вас все — ваши алгоритмы для создания паролей, имя, фамилия, местоположение, сайты на которые вы ходите, день рождения вашей мамы и тп.
У вас получается, что секретом для злоумышленника в таком случае остается только ваш короткий пин. Который еще выходит и одинаковый для разных сайтов?
И да, последний уровень паранойи — считайте, что и ваше оборудование тоже находится под полным контролем злоумышленника. =)3axap4eHko
21.02.2016 08:03Я повторюсь, что координаты — это значение, которое указывается вручную, например через гугл карты, размер пина — это двойка в степени уровня вашей паранойи и символы вы вольны использовать какие угодно, но поверьте, у вас даже с цифрами ничего не выйдет
extempl
21.02.2016 10:11+2Насколько я понимаю, то вы используете координаты, которые возвращаются гуглом по определённому поисковому запросу. Не знаю, как гугл, но я сталкивался с изменениями координат для запроса (проще говоря, центра города) на какие-то там пару метров. Если я правильно понимаю, то в таком случае резко херятся все пароли ко всем ресурсам. То же самое для смен урлов или даже http на https, но локально — придётся менять пароль на самом ресурсе.
В целом, идея интересна с точки зрения самого интереса. Насколько это целесообразно — уже много раз писалось.redmanmale
21.02.2016 14:36Насколько я понимаю, то вы используете координаты, которые возвращаются гуглом по определённому поисковому запросу.
Как я понял, это не так. "Координаты" задаются пользователем ручками, по смыслу это аналог пина, просто задаётся не сразу цифрами, а через гуй на карте.3axap4eHko
21.02.2016 18:01Совершенно верно, хоть кто-то понял
extempl
21.02.2016 23:05Ну хорошо, допустим логика такая: вводим название города, получаем координаты -> вписываем вручную в нужное поле.
Открываем другой комп (новый, взамен украденного/потерянного/переустановка системы/etc) — вводим название города (координаты-то не помним), используем найденные — а они оп, и изменились. Вот о чём речь, нестабильно это как-то, тем более если речь идёт о генерации паролей.3axap4eHko
21.02.2016 23:07все происходит визуально, вы перетаскиваете маркер на карте в нужную точку. Все абсолютно интерактивно.
Посмотрите этоFrankenstine
23.02.2016 11:52Генерация пароля по рандомным датам, получаемым тыканьем в произвольную точку, не подходит для повторного ввода этого же пароля — невозможно ткнуть мышкой в точно ту же координату. Следовательно, придётся 1) порезать карту на достаточно крупные клетки (ограничить разрядность координаты) чтобы нивелировать точность позиционирования (юзер не захочет ломать голову попал ли он в нужный квадрат получив сообщение "введеённые вами данные не подходят"), и 2) пользователю таки придётся помнить куда он ткнул — для каждого ресурса человек неспособен помнить координаты для каждого из них, следовательно будет использовать 1, 2 максимум 3 места.
Я до сих пор не понимаю, как пара цифр будет надёжнее дополнительных пары символов из более широкого словаря в обычном пароле.3axap4eHko
23.02.2016 21:581, 2 максимум 3 места.
Если ввести адрес (город, улица, дом) то маркер попадет в то же место с теми же координатами. Конечно, я получаю их не с точностью до метра, но тем не менее, сколько вы помните различных адресов с точность до дома? Я уверен что десятки.Bronx
23.02.2016 23:42> маркер попадет в то же место с теми же координатами.
Вы можете гарантировать, что это будет так в течение хотя бы года, и что при очередном апдейте карт координаты дома не съедут? Вы же в курсе, что карты основываются и периодически обновляются на базе множества источников данных — аэрофотография, спутниковые снимки, вклад добровольцев на Google Map Maker, возможно импорт данных с Wikimapia, OpenStreetMap где тоже добровольцы вносят редакции?
Чтобы сделать проблему более выпуклой: какую сумму денег вы бы поставили на кон за то, что координаты не станут причиной массовой утери паролей?
Frankenstine
24.02.2016 14:35Адресов помню на память буквально парочку — остальные я помню как добраться, но не почтовый адрес. Потому что письма (бумажные) давно не пишу никому, а в гости — захаживаю :)
Restorer
21.02.2016 09:36Мне кажется, что часть вопросов к статье отпадёт, если сказать что пин — это не обязательно 4х-значное число, а вполне себе может быть неким очень непростым мастер-паролем.
Я как раз использую похожий метод хренения паролей, вместо пина — мастер пароль (сам по себе хороший и рандомный — это единственное что надо запомнить). Только в результирующем пароле использую шестнадцатеричные цифры — при достаточном количестве символов секурность не уменьшается, а набирать пароль на разного рода мобилках становится в разы проще.
ComradeAndrew
21.02.2016 10:47-6Автор, да ты гений! Это ведь теперь вместо пароля можно запоминать не последовательность символов, а любое место на земле. Подобрать в этом генераторе уникальную настройку и брутфорс таких параметров становится совсем нерациональным. А если ещё и пинкод менять относительно времени с какой-нибудь привязкой. То всё, про брутфорс забываем, будто его и не существует.
Мне вот было лень задумываться о своей паранойи, но с таким методом я пожалуй подтяну свою информационную безопасность.
Bronx
21.02.2016 10:55+6Как будут обрабатываться такие сценарии:
* ресурс поменял адрес (пример: «odnoklassniki.ru» >> «ok.ru»)
* один и тот же аккаунт используется на нескольких родственных ресурсах, но там нет единого федеративного логона
* пользователь не стал записывать longitude/latitude на бумажке, надеясь на гуглмап, а однажды ночью наши учёные чуть-чуть изменили гравитационное поле Земли, после чего гуглмап внёс небольшие поправки в свои карты, и теперь потаённое место пользователя имеет слегка другие координаты (ну тут просто: надо ограничить точность координат).
* пользователь плагина замучался каждый раз искать на карте село Гадюкино, в котором он когда-то жил, творил и создавал пароли, и решил использовать координаты Кремля. Нужно перегенерить пароли, но страница смены пароля имеет другой адрес, нежели страница входа — например, у гугла вход на accounts.google.com, а смена пароля — на myaccount.google.com.3axap4eHko
21.02.2016 18:04вам никто не запрещает изменить пароль, или брать его со своего домена, например https://google.bronx.me, а вставлять куда захотите
Vladislav_Dudnikov
23.02.2016 13:32Получается основные вопросы к плагину, а не к концепту?
Bronx
24.02.2016 00:05Скорее наоборот, вопросы к концепту, потому что в его основании лежит генерация секрета на основе данных, которые
а) можно угадать, близко зная человека (домашний адрес), а остаток секрета (пин, срок годности, которые пользователь наверняка будет использовать многократно) легко забрутфорсить
б) являются эфемерными (URL сервиса, который может измениться; координаты, выдаваемые сторонней и неподконтрольной службой).
Плюс не учитывается садистская изощрённость админов, придумывающих всё новые и новые дурацкие политики для паролей. Пароли, сгенерённые без учёта местной политики сайта, будут часто упираться в ошибку валидации («недопустимый символ», «недопустимая длина», «недопустимая комбинация» и т.п), а способа подсказать плагину правильный алгоритм на лету — нету. Если плагин покрывает 80% случаев, но оставшиеся 20% придётся делать вручную и помнить самостоятельно, то лучше всё сразу делать вручную, чем запоминать, где пароль автоматический, а где нет.
lexore
21.02.2016 14:20А как вы меняете пароли?
И что будете делать, если злоумышленник узнает ваш способ генерации паролей?3axap4eHko
21.02.2016 18:18-1А как вы меняете пароли?
У меня пароль использует временную метку и спустя заданный период, он меняется, от чего необходимо сбрасывать его через стандартную форму сброса паролей.
И что будете делать, если злоумышленник узнает ваш способ генерации паролей?
Пока не случалось (за 3 года), но думаю изменю алгоритм генерации
alekseev_ap
21.02.2016 15:05На этом сайте справа есть генератор паролей. Суть: придумываем ключ и вводим его (один для всех ресурсов) и URL. Пароли для каждого URL генерятся разные. Но для пары ключ-URL пароли одинаковые. Можно пользовать для запоминания паролей на всяких форумах и прочих не содержащих финансовую информацию сайтах.
Beholder
21.02.2016 18:52+4Пользователи KeePass уже давно перестали париться, и только все остальные всё продолжают что-то выдумывать...
3axap4eHko
21.02.2016 18:53-1третья стадия
dmitry502
21.02.2016 19:38+2Будто что-то плохое.
Один мастер-пароль и база. Где тут можно закопаться — непонятно. Хотите — используете ключи. Не хотите — не используете. Это уже для тех, за кем могут прийти.
denis4inet
21.02.2016 19:37Или, как вариант, keepassx, только вопросы синхронизации базы между устройствами и удобной интеграции с браузерами для автозаполнения остаются открытыми.
dmitry502
22.02.2016 05:09Извиняюсь за ссылки на себя, но вот предложение для интеграции со всем, чем угодно: https://habrahabr.ru/post/276967/
А вот синхронизация напрямую влияет на безопасность уже, к сожалению.3axap4eHko
22.02.2016 05:18Круто! Я сейчас пытаюсь совместить мою идею с Teensey 3.2, которая через USB работает как клавиатура и мышь, что по сути напоминает Ваш проект
igordata
21.02.2016 21:06-2> Где функция sha512 — генерирует хэши алгоритмом sha512, а функция Base85 — преобразует шестнадцатеричную систему счисления в восьмидесятиричную
Надо не «из шестнадцатеричной», а бинарный сырой хеш брать и переводить. А то бредом попахивает.igordata
29.02.2016 19:33Минусовавшим: если я не ошибасью, функция возвращает строку литералов от a до f, какой смысл энтропию увеличивать и воздух греть лишний раз, и просто раздувать строку, при этом перевод бинарного хеша в Base85 имеет смысл и удобство.
alexf2000
22.02.2016 04:57+1Что если мне надо сменить пароль? Не через месяц и не через год, а уже, потому что он утёк. В любой паролехранилке я это сделаю, а тут — нет. Что если сайт придумал какие-то свои требования для сочетания символов в пароле? 2 больших буквы, 2 маленьких, 2 кириллических и т.п.? Паролехранилка справится, штука из статьи — нет. Что если в штуке сменилась соль по времени, а на нужном сайте как раз сломался сброс паролей? На него будет не зайти, пока не починят, а мне надо экстренно, срочно.
Вывод — придумана глупость. Поставьте кипасс на криптодиск, в экселе наколдуйте парольную карточку 10х20 на миллион комбинаций, туда впишите мастер-пароли диагональю или змейкой и не морочьте себе голову.3axap4eHko
22.02.2016 05:06-1я не предлагаю конкретный подход, это всего лишь идея, ваша аггрегирующая функция может быть какой вам угодно и генерировать по вашему желанию то, что вы захотите, хоть 10 запятых подряд
Вывод — придумана глупость.
Вывод — Вы не поняли ничегоalexf2000
22.02.2016 05:27+1Вы странный. У меня никакого «желания» нет, это у разных сайтов разные требования к паролям. Которые принципиально противоречат друг другу, так что универсальной функции для генерации пароля для любых сайтов быть не может. При всём желании. О чём я и написал. На одном сайте максимальная длина пароля 8 символов, на другом минимум 12, на одном требуют кириллицу, на другом это запрещено.
Ivan_83
23.02.2016 21:50Лет 12 назад или больше я сделал намного проще:
пароль на user@DOMAIN = HMAC(Secret, user@DOMAIN)
user@DOMAIN приводится к одному регистру.
Тогда не было у меня sha2-512, был md5 и sha1 :)
Результат в hex пилю на блоки по 16 и использую.
По хорошему надо бы переделать на более современную хэш функцию и BaseXX вместо HEX, а ещё лучше XOR для двух и более HMAC от разных хэш функций.
Сам по себе хэш не даёт 100% гарантии того что зная часть открытых данных и результат не получится получить оставшуюся часть закрытых данных быстрее, чем перебором.
Те слабость метода в том, что если упереть пароль с одного ресурса то есть вероятность восстановления всей необходимой информации для генерации паролей на других ресурсах.
И потом, хэш функции сами по себе активно исследуют и находят слабости, лет 10 и менее они живут в состоянии когда считаются надёжными.
HMAC ощутимо усиливает любой хэш алгоритм, например hmac_md5 до сих пор считается безопасным.
А если сложить по ХОР результаты двух и более HMAC на разных хэш функциях то результат по надёжности будет как самый лучший HMAC+HASH.
Чёто я разошёлся, дешевле будет нанять пару отморозков которые получать все пароли на бумажке, чем возится хотя бы с одним HMAC :)3axap4eHko
23.02.2016 22:00но ведь хэш в hex это строка состоящия из символов [0-9a-f], тут даже речи не идет про регистр и знаки пунктуации
Ivan_83
24.02.2016 23:19С одной стороны да, пароль с низкой энтропией.
С другой стороны 16 HEX это 2^64 вариантов, те весьма не мало.
Использование base64 даёт 2^96 при тех же 16 символах в пароле.
Base85 даёт немного больше, но смысла в этом уже нет.
Мне не нравится идея со всякими символами тк пароль не всегда вводится в адекватные сервисы, а некоторые сервисы могут начать ругаться на всякие символы отличные от букв и цифр.
Ещё б64 у меня есть, а б85 нужно кодить.
Ещё не понятно как б85 будет нарезать исходный ключевой поток.
Вполне очевидно что даже полный перебор 2^64 по сети будет идти довольно долго, а 2^96 не реально долго, опять же дешевле и быстрее заслать кого то физически чем тратить время на этот онанизм по сети.
В следующей версии сделаю пачку разных HMAC с хор на выходе и б64, только пока необходимости нет.
dmitry502
Возможно у меня совсем уже ночь, но я верно понял, что единственная вещь, которая действительно неизвестна злоумышленнику — четырехзначный пин?
Идея необычная и интересная, но лично я вижу тут концептуальную проблему: вы считаете, что информация о пароле не хранится нигде, но на самом деле, информация о пароле хранится везде, но не вся(пин у вас в голове).
Я не очень понял про координаты. Это ваши координаты или сервера? В первом случае, они будут меняться, как и пароль. Во втором — они доступны всем в интернетах.
А теперь досадная часть: вы когда-нибудь перебирали пароли? Не брутфорся сайт, а имея базу хэшэй. Я писал простенькую софтину, которая перебирала пароли для одной базы(не злого умысла ради, а чсв для), где люди таки научились к 2013-му году делать hash(hash(pass)+user_id). Хоть это и заставило меня брутить месяц(мне лень было использовать gpu), но я получил более 80% паролей.
Скорее всего, Hashcat или кто-нибудь еще так умеют(мне сильно мешал id юзера и мне приходилось перебирать сильно больше, чем если бы была обычная соль), да еще и на gpu, но не суть.
Идея в том, что брутфорсить можно долго и упорно. В вашем случае это не так сложно. Я бы впал в депрессию, если бы узнал, что есть целая база подобных паролей. Ну и писал бы свой брутфорсер.
Но, опять же, возможно я неверно понял концепцию, тогда извиняюсь
3axap4eHko
Нет. Имя пользователя, пин, размер пароля (долгота и широта опционально), даже последовательность может быть разная. Ну и кусок от хэша с любого индекса. Причем пин вы можете придумать скольугодно длинный буквенно-цифровой
Координаты вы можете выбрать сами, какие вам нравятся. Например лбимое вам место.
Смотрите, в данном случае, pass на сайте это наш сгенерированный пароль, который так-же является результатом некой хэш-функции.
Концепция — перестать хранить пароли
dmitry502
Ну, тогда я все верно понял. Единственная действительно неизвестная вещь это пин и, раз уж вы настаиваете, то формат.
Проблема в том, что большинство людей очень похожи. И будут придумывать одинаковые комбинации.
Перебрать это все не такая уж и проблема. Зависит от того как люди будут придумывать это все. Будет ли у них код, в котором они это велосипедят? Или будет менюшка гуевая с настройкой всего.
Но в любом случае 80% оставят дефолтные настройки.
Но человек снизу верно сказал, что это security through obscurity. К тому же, тогда частью хранения пароля является их формирование(ваш скриптец, который будет свой у каждого юзера)
Упрем скрипт(который юзер будет непонятно_как синхронизировать между тоннами девайсов) — получим доступ к его аккаунтам. Учтем еще, что юзеры, поверевшие в безопасность всей системы, будут использовать пин(или все другие заменяющие пароль вещи) как пин, а не как пароль и будут делать его слабым, надеясь на остальную магию. А потом будут удивляться как за 7 секунд сбрутили акк.
В итоге, вы придете к тому, что вместо пина должен быть полноценный пароль, а все остальное не гарантирует безопасность.
Вы не ушли от хранения паролей. Вы ушли от хранения паролей старыми способами. По факту, хватило бы и мастер-пароля(он будет един и у вас, тут вы его назвали ПИН) + PBKDF2 для генерации сотен паролей для других сервисов
3axap4eHko
Почему только пин, прочитайте параметры [ url.origin, username, pin, size, expired, latitude, longitude ];
Так же можно добавить гироскоп, акселератор и кучу других параметров
dmitry502
Это все информация, которая от чего-то зависит. Она не рандомная. Ее можно узнать и ЗНАЧИТЕЛЬНО упростить брутфорс.
url.origin — адрес сайта
username — юзер
expired — год/дата(сьрутить дату очень просто)
latitude/longtitude — какие-то места. И их не много. У людей будет список мест, которые они будут выбирать. Не у каждого будет лично свое место.
Вся эта информация не абсолютно рандомна. Ее можно сбрутить, потому что она от чего-то зависит. Например, часть людей будет юзать кремль. Достаточно поиметь 10к локаций и мы будем чаще всего угадывать.
Люди — не генераторы рандомных чисел и склонны генерировать одинаковые данные. С паролями мы более-менее обучились, но чтобы понять какие ошибки будут совершать люди с координатами(например), надо провести еще множество исследований, а потом еще и обучить людей новым правилам.
Одним из правил создания хорошего пароля является "не использовать личных данных", а у вас на этом много завязано.
Вам нужен password derivation(https://en.wikipedia.org/wiki/PBKDF2) и один мастер-пароль. Но и это сомнительно с точки зрения безопасности.