Привет, %username%
Одиночество и паранойя могут быть прекрасным творческим материалом.
Энн Ламотт
Каждый из нас проходит несколько стадий паранойи хранения паролей. На первой стадии идет процесс придумывания не простого, но запоминающегося пароля. На второй, появляется второй пароль и один становится личным (какие-либо приватные почтовые ящики), а второй публичным (форумы, соцсети и т.д.). С двумя паролями появляются и дополнительные почтовые ящики — личные и публичные. На третьей — приходит мысль, что стоит создать для каждого ресурса свой пароль, но в виду того, что человеческая память ограничена в запоминании, в арсенале появляются программы для хранения паролей и для них придумываются мастер-пароли, кто-то пользуется файловыми ключами, которые тоже запаролены и среди всего этого начинаешь понимать, что так можно закопаться в паролях и в паролях от паролей бесконечно глубоко. Если интересно как я решил эту проблему, добро пожаловать под кат.
Для начала взглянем на ситуацию в общем. Есть ресурс, который можно идентифицировать. Например, веб-ресурс идентифицирется по схеме, хосту и порту, например 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. Только заметил, что в таком случае, фишинговые сайты в пролете на мой пароль
Автор: 3axap4eHko