Как это работает


Принцип работы менеджера паролей…

Исходный код менеджера паролей Мои Пароли является полностью открытым и доступным для просмотра. Менеджер паролей Мои Пароли использует известные алгоритмы шифрования и они надёжны. Далее подробно рассмотрим схему работы менеджера паролей.

Менеджер паролей обеспечивает надёжное хранение секретной информации за счёт реализации следующих принципов:

Благодаря шифрованию на стороне клиента, менеджер паролей гарантирует сохранность Ваших конфиденциальных данных, даже в случае взлома сервера, кражи данных из БД, либо перехвата информации при передаче.


Схема шифрования…

Для шифрования данных используется алгоритм симметричного шифрования BlowFish. Поэтому для шифрования и расшифрования используется один и тот же ключ. Ключ шифрования строится на основе информации, введённой пользователем при входе в систему. Шифрование производится каждый раз перед отправкой данных на сервер, расшифрование - при получении ответа от сервера.

передача паролей между браузером и менеджером паролей
Схема взаимодействия клиентской и серверной части менеджера паролей.

Таким образом, расшифровать информацию, хранящуюся в менеджере паролей, не зная логин и пароль пользователя, невозможно.


Усиленный алгоритм хэширования MD5…

Поскольку хранить пароль и логин в открытом виде в БД нельзя, перед отправкой на сервер и записью в БД они преобразовываются. Для этого получают MD5-хэш. MD5-хэш предназначен для создания отпечатков, или контрольных сумм. MD5 является односторонним алгоритмом хэширования, то есть обратной расшифровки не имеет. Выходная строка всегда имеет постоянную длину в 32 символа. Восстановление данных, зашифрованных этим алгоритмом, возможно лишь методом грубой силы, то есть брутфорсом (берется хэш от предполагаемого текста, хэш-суммы сравниваются, если они не равны, значит, текст другой). На данный момент существует множество программ для осуществления подбора паролей: PasswordsPro, MD5Inside, John the Ripper, RainbowCrack.

В алгоритме MD5, как и в его предшественнике MD4, возможно появление коллизий (повторов), то есть сложный пароль длиной в 32 символа, содержащий спецсимволы, цифры, буквы разных регистров, может дать такую же хэш-сумму, как и, к примеру, пяти-, шестисимвольный простой пароль. Однако вероятность появления коллизий цифрового дайджеста MD5 критически мала. Теоретически это вполне реально, количество всех возможных сообщений, дающих цифровые дайджесты, равно 2^256, однако на их поиск потребуется задействовать слишком много компьютерных ресурсов. Чтобы избежать этого, а точнее, чтобы свести шанс появления коллизии практически к нулю, разработчики программного обеспечения придумали способ искусственного усложнения пароля - накладывание «соли».

«Соль» представляет собой некий набор символов; обычно это символы обоих регистров, цифры и спецсимволы, которые накладываются или склеиваются с самим паролем или с хэш-суммой пароля.

На данный момент известны следующие способы наложения соли:

Оба способа соления не являются крипстойкими алгоритмами, так как перебор пароля, состоящего из букв, с помощью PasswordsPro занимает пару секунд. Их применение в качестве основного способа хэширования может быть опасным. Разработанный усиленный алгоритм хэширования основан на использовании метода сдвига и замены. Первым делом объявляется массив спецсимволов, которые будут участвовать при работе метода замены: var specSymbols = ["~","!","@","#","$","%","^","&", "*","?"]; Далее получаем уже описанную выше хэш-сумму от стандартного метода соления (md5(md5(pass).md5(salt))): var saltHash = simpleMD5.getMD5( simpleMD5.getMD5(salt) + simpleMD5.getMD5(text) ); Объявляется переменная, в которой будет храниться хэш от несоленого пароля: var plainHash = simpleMD5.getMD5( text ); Следующим шагом является составление таблицы соответствия хэш-суммы от соления и хэш-суммы от не соления.

Plain password Plain password + Salt Changed
c e C
0 6 ~
a 1 A
8 2 *
e c v
1 1 !
e f f
5 3 %
e 0 0
3 5 #
0 5 ~
7 a &
c c C
c 3 C
5 f %
b 9 B
3 C #
3 3 #
8 1 *
1 f !
9 5 ?
b 2 B
3 d #
8 4 *
7 2 &
b 1 B
5 a %
f 3 3
0 e ~
1 7 !
F 2 2
D 1 D
Сравнение хэшей.

Алгоритм усиления будет следующим: если n’ый символ в MD5-хэше от plain-текста (нешифрованного текста) является цифрой, то в соленом хэше он поменяется на спецсимвол, номер которого в ранее объявленном массиве соответствует этой цифре. То есть второй символ в plain-строке - ноль. Следовательно, он заменит символ «6» в соленой строке символом «~». Далее, второе условие: если n’ый символ в MD5-хэше от plain-текста является буквой и попадает в диапазон a-d, то в соленой строке он переводится в верхний регистр. Ну и если ни одно из условий не выполняется, то в соленой строке он поменяется на символ с соответствующим порядковым номером из строки saltHash.

В листинге представлен алгоритм усиленно MD5-хэша. // создание объекта MessageDigest для вычисления MD5-хэша
var simpleMD5 = new com.oclib.javascript.security.MessageDigest();
// соль
var salt = "123!#&%asgfHTA";
// массив спецсимволов
var specSymbols = ["~", "!", "@", "#", "$", "%", "^", "&", "*", "?"];
// "солёный" хэш: md5( md5(salt) + md5(text) )
var saltHash = simpleMD5.getMD5( simpleMD5.getMD5(salt) + simpleMD5.getMD5(text) );
// md5-хэш от строки text
var plainHash = simpleMD5.getMD5( text );
// сюда будет записан усиленный MD5-хэш
var resultHash = "";
// вычисление усиленного MD5-хэша
for( i=0; i%lt;salthash.length; i++)="" {
if (parseInt(plainHash.charAt(i)) >= 0 &&
parseInt(plainHash.charAt(i)) <= 9) {
// если очередной символ в plainHash - цифра
resultHash += specSymbols[parseInt(plainHash.charAt(i)) ];
} else {
if (plainHash.charCodeAt(i) >= 97 &&
plainHash.charCodeAt(i) <= 100) {
// если очередной символ в plainHash от a до d
resultHash += plainHash.charAt(i).toUpperCase();
} else {
resultHash += saltHash.charAt(i);
}
}
}
resultHash = simpleMD5.getMD5( resultHash );

После использования этого усиленного метода простенький пароль proba превращается в «E~1*c!f%0#~&C3%9##*!?2#*&1%3~!21». А чтобы такой хэш не отличался от остальных MD5-хэшей, его необходимо перевести снова в MD5-хэш. Шанс подбора такого пароля снижается практически до нуля.

Поскольку на сервере хранятся усиленные хэши от логина и пароля пользователя, злоумышленник даже получив доступ к БД менеджера паролей не сможет расшифровать хранящуюся в ней информацию пользователя.


Почему AJAX…

AJAX (от англ. Asynchronous JavaScript and XML — «асинхронный JavaScript и XML») — это подход к построению интерактивных пользовательских интерфейсов веб-приложений, заключающийся в «фоновом» обмене данными браузера с веб-сервером. В результате при обновлении данных веб-страница не перезагружается полностью, и веб-приложения могут быть сделаны более быстрыми и удобными

классическая модель хранения паролей и хранение паролей в менеджере паролей

Применение технологии AJAX обусловлено следующими причинами:

хранение паролей в менеджере паролей с использованием AJAX

Благодаря применению AJAX, менеджер паролей никогда не перезагружается, поэтому ключ шифрования в течение всего сеанса хранится в памяти браузера.


Назад