Как правильно хранить пароли

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

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

Для начала взглянем на ситуацию в общем. Есть ресурс, который можно идентифицировать. Например, веб-ресурс идентифицирется по схеме, хосту и порту, например https://login.awesome.site.com/, в свою очередь десктопное приложение может быть идентифицировано по имени исполняемого файла, например awesom-app.exe или по заголовку окна или его части. Итак с идентификатором разобрались.

[ad name=»Responbl»]

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

image
А сами пароли от сайтов нигде не хранятся и моя паранойа пока спит спокойно.

P.S. Если есть идеи как можно усовершенствовать эту идею, буду рад увидеть в коментариях.
P.P.S. Опечатки и ошибки пожалуйста в ЛС.
P.P.P.S. Дабы упредить вопросы о сложности расшифровки, предположим что мой ник и pin 1234 использовались для генерации пароля, хотя давайте предположим, что пин вы не знаете. Тогда какой у меня пароль?
P.P.P.P.S. Только заметил, что в таком случае, фишинговые сайты в пролете на мой пароль

UPD:
Схема генерации:
image

Click to rate this post!
[Total: 3 Average: 4]

Специалист в области кибер-безопасности. Работал в ведущих компаниях занимающихся защитой и аналитикой компьютерных угроз. Цель данного блога - простым языком рассказать о сложных моментах защиты IT инфраструктур и сетей.

2 comments On Как правильно хранить пароли

Leave a reply:

Your email address will not be published.