Как это работает
Принцип работы менеджера паролей…
Исходный код менеджера паролей Мои Пароли является полностью открытым и доступным для просмотра. Менеджер паролей Мои Пароли использует известные алгоритмы шифрования и они надёжны. Далее подробно рассмотрим схему работы менеджера паролей.
Менеджер паролей обеспечивает надёжное хранение секретной информации за счёт реализации следующих принципов:
- Хранение информации на сервере в зашифрованном виде
- Осуществление процесса шифрования всей информации на стороне клиента
- Передача информации от клиента серверу и обратно только в зашифрованном виде
- Применение в качестве ключа шифрования информации, введённой пользователем при входе в систему, причём серверу она никогда не передаётся
Благодаря шифрованию на стороне клиента, менеджер паролей гарантирует сохранность Ваших конфиденциальных данных, даже в случае взлома сервера, кражи данных из БД, либо перехвата информации при передаче.
Схема шифрования…
Для шифрования данных используется алгоритм симметричного шифрования BlowFish. Поэтому для шифрования и расшифрования используется один и тот же ключ. Ключ шифрования строится на основе информации, введённой пользователем при входе в систему. Шифрование производится каждый раз перед отправкой данных на сервер, расшифрование - при получении ответа от сервера.
Таким образом, расшифровать информацию, хранящуюся в менеджере паролей, не зная логин и пароль пользователя, невозможно.
Усиленный алгоритм хэширования MD5…
Поскольку хранить пароль и логин в открытом виде в БД нельзя, перед отправкой на сервер и записью в БД они преобразовываются. Для этого получают MD5-хэш. MD5-хэш предназначен для создания отпечатков, или контрольных сумм. MD5 является односторонним алгоритмом хэширования, то есть обратной расшифровки не имеет. Выходная строка всегда имеет постоянную длину в 32 символа. Восстановление данных, зашифрованных этим алгоритмом, возможно лишь методом грубой силы, то есть брутфорсом (берется хэш от предполагаемого текста, хэш-суммы сравниваются, если они не равны, значит, текст другой). На данный момент существует множество программ для осуществления подбора паролей: PasswordsPro, MD5Inside, John the Ripper, RainbowCrack.
В алгоритме MD5, как и в его предшественнике MD4, возможно появление коллизий (повторов), то есть сложный пароль длиной в 32 символа, содержащий спецсимволы, цифры, буквы разных регистров, может дать такую же хэш-сумму, как и, к примеру, пяти-, шестисимвольный простой пароль. Однако вероятность появления коллизий цифрового дайджеста MD5 критически мала. Теоретически это вполне реально, количество всех возможных сообщений, дающих цифровые дайджесты, равно 2^256, однако на их поиск потребуется задействовать слишком много компьютерных ресурсов. Чтобы избежать этого, а точнее, чтобы свести шанс появления коллизии практически к нулю, разработчики программного обеспечения придумали способ искусственного усложнения пароля - накладывание «соли».
«Соль» представляет собой некий набор символов; обычно это символы обоих регистров, цифры и спецсимволы, которые накладываются или склеиваются с самим паролем или с хэш-суммой пароля.
На данный момент известны следующие способы наложения соли:
- md5(md5(salt).md5(pass))
- md5(md5(pass).salt)
Оба способа соления не являются крипстойкими алгоритмами, так как перебор пароля, состоящего из букв, с помощью 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 обусловлено следующими причинами:
- Всё время работы менеджера паролей клиентская часть системы должна хранить ключ шифрования (который в свою очередь построен на основе логина и пароля пользователя), чтобы с его помощью выполнять шифрование и расшифрование данных.
- Ключ шифрования не должен передаваться серверу
- Ни одна из существующих технологий не позволяет более-менее безопасно передавать данные напрямую от страницы странице (Cookies, POST, GET не учитываются как небезопасные).
Благодаря применению AJAX, менеджер паролей никогда не перезагружается, поэтому ключ шифрования в течение всего сеанса хранится в памяти браузера.