Хранение паролей без их сохранения

в 16:08, , рубрики: генератор паролей, информационная безопасность, криптография, менеджер паролей, пароли, Программирование, хэш-функция, метки: , , ,

Здравствуйте. Примерно два года назад на Хабрахабре я из некого комментария познакомился с интересным способом хранения паролей без их сохранения. Фраза выглядит странно, но более точно описать род этой программы мне не получилось. Способ заключается в том, что для получения пароля к конкретной учетной записи на конкретном сайте необходимо загнать в хэш-функцию строку, «склеенную» из мастер-пароля, адреса сайта, и логина на сайте.
keyword+sitename+login
В данной строке keyword – это мастер-пароль, используемый для «хранения» паролей ко всем сайтам. Далее идет адрес сайта, затем логин. Загнав в хэш-функцию данную строку, мы получим на выходе строку символов, которую полностью или частично можно использовать в качестве пароля к данной учетной записи на данном сайте. Ключевое слово в начале строки обеспечивает невозможность узнать пароль, если известны адрес сайта и логин. Длина результата хэш-функции более чем предостаточна для пароля. Но надежность пароля все равно оставляет желать лучшего. Каждый символ такого пароля может принимать только одно 16-ти значений, так как результатом хэш-функции является строка чисел в шестнадцатеричном представлении.
Я попытался исправить этот недостаток. Далее расскажу как.

Как работает программа

Результат хэш-функции — шестнадцатеричная строка, состоит из шестнадцатеричных знаков «0123456789ABCDEF».
Например, из строки «keyword+sitename+login» после прогона через хэш-функцию sha256 получится хэш:
dc6463dfd7d86d06db49ea63061c9a8bf6a7ff17fe23b5bd3dfbd7a25d1b6769
Каждый знак является половиной байта (тетрадой). Комбинация двух соседних символов может принимать 256 значений, так как представляет собой символьное представление байта. Программа обрабатывает хэш-строку группами по два символа.
dc 64 63 df d7 d8 6d 06 db 49 ea 63 06 1c 9a 8b f6 a7 ff 17 fe 23 b5 bd 3d fb d7 a2 5d 1b 67 69
Каждую группу программа переводит в числовое представление. Получится число от 0 до 255. Значений более чем предостаточно для кодирования одного символа пароля. В программе для генерации пароля я использовал строчные и прописные латинские символы и цифры, итого 63 возможных символа. Далее набор возможных символов пароля я буду называть алфавитом. Алфавит можно сделать по своему желанию, в зависимости от того, сложный пароль нужен, или простой. Для этого всего лишь необходимо изменить одну строчку программы. Программа написана на языке C++.
const string alphabet="1234567890qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM";
Далее программа находит остаток от деления байта на число символов в алфавите (63). Остаток от деления на 63 может принимать значения от 0 до 62. Этот остаток и будет индексом символа в строке alphabet.
Выкладываю часть программы, отвечающую за обработку хэша. В конце статьи есть ссылка на полный исходник программы.

#include <cstdio>
#include <cstddef>
#include <string>
#include <iostream>
#include "sha256.h"

 void convert(string strIn, string &strOut)
{
    const string alphabet="1234567890qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM";
    const string hex="0123456789abcdef";
    unsigned char str[32];
    for(int i=0; i< 32; i++) {
        str[i]=hex.find_first_of(strIn.at(i*2))*16+hex.find_first_of(strIn.at(i*2+1));
        strOut.at(i)=alphabet.at(str[i] % alphabet.length());
    }
}

int main() {
	SHA256* yourInstanceName = new SHA256();
	std::string digest;
	string strIn, strOut="00000000000000000000000000000000";
	while(true) {
		cin >> strIn;
		convert(yourInstanceName->hash(strIn), strOut);
		cout << strOut << endl<< endl;
	}
	return 0;
}

Как пользоваться программой

Пользоваться программой просто. Вводите мастер-пароль, адрес сайта, логин. Нажимаете enter. Всю необходимую информацию (адрес сайта, логин) можно хранить в голове или где-нибудь записать. Эта информация не секретна. А вот мастер-пароль придется запомнить.
Например, вводим в консоль строку:
keyword+sitename+login
Нажимаем enter, получаем пароль:
nEWWzxS7bwDW7lxyNI8f7mC4M4zEckYI
Пароль состоит из 32-х символов и выглядит вполне надежным

Плюсы программы

  • База паролей, как в случае с программами, аналогичными KeePass, отсутствует. Значит не надо делать бэкапы базы паролей.
  • Базу паролей невозможно своровать или взломать потому, что ее нет.
  • Реализация программы очень простая.
  • Кроссплатформенная, т.к. используются только стандартные библиотеки C++.

Минусы программы

  • На данном этапе программа консольная, трудно копировать из нее пароль.
  • Надо помнить или записывать адрес сайта и логин к нему.
  • Изменить пароли проблематично.

Теперь расскажу о небольшом минусе такого способа превращения байта в один из 72 символов алфавита. Минус заключается в том, что при использовании остатка от деления в качестве индекса символа в алфавите, часть алфавита с индексами от 0 до 255%63 имеет больше шансов попасть в пароль. Для наглядности приведу пример с делением «игрушечного» 3-битового числа на 3. 3-битовое число может принимать значения от 0 до 7. Знаком «процент» я обозначил операцию нахождения остатка от деления. Высшей математики не будет, извините.

0%3=0 3%3=0 6%3=0
1%3=1 4%3=1 7%3=1
2%3=2 5%3=2

Видим, что двойка в результате нахождения остатка от деления попадается реже, нежели нуль и единица. Аналогичная ситуация будет и с делением байта на число символов в алфавите. Эту проблему можно решить, если использовать остаток от деления не байта, а слова (т.е. двух байт). Тогда попадание всех символов в пароль станет более равновероятностным. Однако длина пароля уменьшиться еще в два раза, т.е. станет равной 16 символов. Такой пароль в некоторый случаях будет считаться слишком коротким. Эту проблему можно решить повторным прогоном хэша через хэш-функцию. Видим, что данным минус вполне исправим.

Заключение

Хотелось рассказать про эту программу на хабре и почитать комментарии. Этой программой было интересно заниматься, потому, что идея довольно простая и перспективная, а аналогов в интернете найти не удалось. Если вы знаете программы, аналогичные вышеописанной, напишите, пожалуйста, название в комментариях. Также прошу не слишком сильно пинать за то, что у программы отсутствует товарный вид. Программу следует рассматривать как учебную.

В архиве по ссылке находится скомпилированная программа и исходник: Все распространяется под лицензией GPL. =)
rusfolder.com/31528284

Автор: RNT

* - обязательные к заполнению поля