Master Password
Обновена на: 24 март 2022 г.Последните месеци много си играя с пароли. Впрочем, научих се на малко стенография и пиша странно в тефтер. Т’ва е яко, но някъде в Редит по едно време видях човек, който твърди, че е написал най-лесния и приятен password manager ever. Заиграл се бях с пас-мениджъри, но не ми хареса идеята такъв да стои на всяка машина и впрочем, да го свалям на всяка нова инсталация, или където искам да се логна.
Хареса ми идеята на въпросния редитор, но имплементацията му ми се стори трудоемка. Апликацията, която той е написал, е зависима от библиотека, която нито е POSIX, нито лесно се вкарва в стандартни уеб приложения, камо ли при липса на javascript (Tor environment). Затова много се надъхах да направя своя имплементация. Проста, но сравнително secure.
Идеята е да имаш главна парола, от която да генерираш сигурни, дълги compliant пароли – отделни за всеки сайт. Теоретично имаш две полета – името на сайта и мастър паролата ти. Сайтът играе сол при хеширането на главната парола, тоест резултата винаги ще бъде същия при конкретна сол (сайта). Естествено, само двете полета не стигат, понеже ако двама души с еднаква главна парола ползват един и същи сайт, тяхната нова парола ще бъде еднаква.
Тук идва допълнителното поле – user salt. Masterpassword.app те кара да си напишеш пълното име и т’ва е готина сол. Но шансовете някой да ти отгатне мастъра и да ти знае името са високи. Моят алгоритъм маже уебсайта, дължината му и мастъра, и можеш да ползваш каквото искаш за сол. Не е задължително, но трябва да си наясно, че тогава важи гореспоменатото с еднакви мастър пароли.
Та алгото ми е следното:
Хашваме ти мастъра със sha-256, после мачкаме дължината на сайта, самия сайт и солта ти. Това наричам $content. Правим HMAC на “съдържанието” чрез sha-256 отново, ползвайки предварително хеширания мастър за ключ. HMAC на манджата с хеширания мастър. Тоя HMAC е самата ти парола, но не преди да бъде обърната в base64 и четена отзад-напред. Защото така винаги взимам онези две “=” на края на base64-та. Не за друго, а защото някои сайтове имат изискване паролите да имат малки, големи букви, цифри и специални символи.
Последното поле е дължината на паролата, която по подразбиране е 19 символа. Отзад-напред. И защото мога, ти генерирам един 10-символен (преди правех 6, но 10 е по-куул) username, базиран на ключа (хаша на мастъра), забит с дължината на сайта. Т’ва се md5-ва и обръща в base64, само че се чете отпред-назад. Супер много се бях навил да генерирам произносими username-ове на база една мъничка граматика, но там е по-гот, ако има randomness елемент. Аз би трябвало да правя дълги username-ове, ако искам да се възползвам от това. Пък и не е това целта – тя е да имаш набързо user с парола, в случай че ти трябва спешно и display name-a е различен от самия username.
И как сменяме пароли? Сменяме солта. Същия мастър с различна сол ще ти даде същото username и нова парола. Солта може да е просто итерация – от 1 до 10 и т.н., а може да е кратка дума, твоето име или к’вото си искаш, заедно с цифра. За да се запомня лесно коя генерация е нужната парола.
Имплементацията ми е мъничка – има я на https://8218.ga/master. Кодът е публично достъпен, но не е в джитхюп, патамуща защото.