Хранение паролей в незащищенном месте
Есть у кого соображения как хранить удаленно базу данных паролей напр. на e-mail или удаленном сервере? В KeePass есть интересная фича – "Number of key transformation rounds" где можно установить значение "Delay" т.е. кол-во итераций хеширования как я понимаю. При экспорте базы можно устанавливать большое кол-во проходов, что на экспортной копии базы сведет атаки типа brute force на нет.
Например установив значение 9911238656, Core I7 считал 5 минут при 100% двух ядер для проверки одного пароля. Очень эффективная опция для хранителей паролей которые увы нет в Password Safe...
Ссылки
[link1] https://www.pgpru.com/comment40354
[link2] https://en.wikipedia.org/wiki/Password_strength#Random_passwords
[link3] https://en.wikipedia.org/wiki/PBKDF
[link4] http://www.tarsnap.com/scrypt.html
[link5] http://netbsd.gw.com/cgi-bin/man-cgi?cgdconfig+8+NetBSD-current
[link6] http://netbsd.gw.com/cgi-bin/man-cgi?passwd.conf+5+NetBSD-current
[link7] http://www.openbsd.org/cgi-bin/man.cgi?query=login.conf&sektion=5&arch=i386&apropos=0&manpath=OpenBSD+Current
[link8] http://www.openbsd.org/papers/bcrypt-paper.ps
[link9] http://netbsd.gw.com/cgi-bin/man-cgi?cgdconfig++NetBSD-current
[link10] https://www.pgpru.com/comment45000
А записать пароли в файл и зашифровать его открытым ключом, закрытая часть которого лежит на Вашей машине? Да хоть даже закрыть базу случайным 20-значным паролем, который, опять же, хранится на Вашей машине. Вы не привели модель угрозы и требования, так что насоветовать можно, что угодно и в любом количестве.
Так вариант этого 20-ти значного пароля проверяется за доли секунды, как и 2 значного.
Максимально снизить вероятность получить пароль с помощью распределенных вычислений – brute force атак, Радужных таблиц и т.п в данном направлении.
Про стойкость паролей[link1].
Вот здесь[link2] удобная табличка оценки энтропии.
Ассиметричное шифрование это хорошо, но разве закрытый ключ правильно без passphrase оставлять?
Ничего не даст противнику. 128-битный ключ при условии, что алгоритм надёжен, нельзя вскрыть без квантового компьютера.
Мало поможет. Максимум снизит сложность на пару порядков, что недостаточно.
Радужные таблицы применяются когда известен хэш и не использовалась соль. К данному вопросу не имеет отношения.
Опция эта PBKDF2[link3] — стандартная и должна, по идее, в обязательном порядке использоваться во всех криптографических программах, в которых генерируется ключ из пароля. Хотя, не везде есть возможность менять дефолтные значения.
Возможность эта не настолько эффективна как кажется. С вашим запредельным числом итераций вы внесли всего около тридцати бит "фиктивной" вычислительной энтропии. Это скромный результат. Сравните по вышеприведённым ссылкам, насколько для достижения аналогичного результата потребовалось бы увеличить пароль.
Альтернативный нестандартизированный вариант — scrypt[link4] — размен с упором не на количество операций, а на требования к памяти. Если для одной машины несколько мегабайт некритично, то при массированном распараллеливании, особенно на видеокартах (на которых из-за высокого быстродействия и параллелизации просчитывают радужные таблицы, генерируют биткоины), это ставит противника в трудное положение.
Тоже верно.
Интересно, он где-то уже используется? Судя по рекламе на слайдах, он в сотни раз замедляет перебор по сравнению с PBKDF2. По вашей ссылке на вики тоже очень рекламируется:
А что можно сказать про bcrypt в сравнении с PBKDF2? Кстати, в OpenBSD не bcrypt ли используется для хранения паролей в /etc/master.passwd и для их vnconfig? Вообще, было бы интересно увидеть список какие KDF используются в разных Unix'ах. Что-то известно про применение scrypt для софта в Linux?
Посмотрел на NetBSD. В cgd там-таки pbkdf2[link5], но в /etc/master.passwd всё тухло[link6]. Лучшее, что есть — blowfish+раунды. И, вообще, что значит «blowfish как hash-функция»? Поглядел в /etc/passwd.conf, который автоматически создаётся при инсталляции и выборе самых безопасных опций:
При этом в OpenBSD аналогичный дефолт[link7] — «blowfish,6». В статье[link8] про bcrypt говорится, что его сделал «The OpenBSD Project» — это оно и есть в опциях с blowfish? В предпоследней ссылке:
P.S.: А про сам проект http://www.tarsnap.com, куда ведут ваши ссылки, что можете сказать? Он чем-то лучше tahoe или совсем нераспределённый?
есть мнение, что в данном случае на сервере должны быть не пароли, а хеш+соль.
Ему ж не авторизовываться на сервере надо, а хранить бэкапы самих паролей, потому хэш+соль не подойдут.
Блин, не понял идею в начале. Получается, что сложность пороля увеличивается, так как к нему добавляется число проходов, но при расшифровке даже зная пароль выполняется некоторый брутфорс в течении 5-10 минут. Кто, что думает, сравнимы ли по вычислительной сложности задачи вида пароль=X+Y и пароль=X + проходов=Y. Что-то мне кажется, что вторая задача не должна брутфорситься больше, чем первая.
Сама идея весьма интересна, только лучше её переформулировать в такую: пользователь вводит пароль(или подсовывает ключ), и к нему присовокупляется ещё, ну три-четыре символа из /dev/urandom. При расшифровке требуется кроме правильного пароля ещё немного брутфорса, но разумное время(допустим 10 минут). Ясно, что сложность взлома растёт, так как выросла энтропия пароля.
Вам неочевидно, зачем применяются специальным образом сконструированные key derivation function, замедляющие перебор?
Уже понял зачем. Возникает тот же вопрос, допустим у нас есть файл и надо его зашифровать так, чтобы на проверку одного пароля уходило по 5 минут. Чем это сделать? Как вариант я уже понял как это реализовать несколькими способами, но вот что насчёт готового утиля?
Например:[link9] Можно генерить paramsfile и для своих целей, необязательно его использовать для того, что в man описано. Параметр iterations можете поменять руками, но не переусердствуйте. Если поставить раз в 10-100 больше, чем в норме, пароль будет проверяться минуту.
о, спасибо, надо брать на вооружение
В LUKS должно иметься что-то подобное, но это unknown может лучше подсказать.
Вот ещё[link10]:
В LUKS число итераций в PBKDF2 подбирается так, чтобы вычисление ключа из пароля занимало ровно 1 сек. на текущей машине. Это число можно принудительно менять опцией --iter-time.
Хочется хранить пароли удаленно. Иметь возможность открыть базу паролей имея только пароль. Но в таком случае усложить задачу атак перебором.
Господа а как на счет криптографических приложенияй способных не только менять кол-во итераций хеширования но и опционально выставлять другие параметры, например таких кол-во итераций шифра, размер блока и т.д..?
Ну вопрос был скорее про вычленение PBKDF2-функционала из LUKS. Т.е. нужен чёрный ящик, где на входе пароль, а на выходе — ключ шифрования и его соль. Впрочем, LUKS, пожалуй, умеет разглашать используемый ключ (наверняка опция есть), поэтому должно решаться.
Есть методы монтирования удалённых контейнеров, работы с удалёнными шифрованными файлами и т.д. См. в сторону функционала EcryptFS, EncFS, Tahoe и др. Файл будет шифроваться на компьютере пользователя, а на удалённой файловой системе писаться уже шифрованным.
На уровне простой опции не скажу, но примеры использования у авторов есть. Как и примеры цепочечного расшифрования контейнеров по одному паролю, у которых ключ-пароль связаны хэшем.
Если шифр не подразумевает такой возможности штатно, то вы рискуете изменив число раундов даже в сторону увеличения открыть путь к слайд-атаке или ещё какой неприятности. Или об итерациях какого шифра речь? Вроде разговор о хэше?
Я так понял, что речь идёт о кратном шифровании.
Т.е. каскады шифров? Это есть в Truecrypt.
вот тут как раз вопрос – 1млн hash=sha512(hash) против sha512(text+randomtext[0..5]), т.е. не безопасней ли вместо раундов добавлять в пароль случайный текст и при проверке пароля добрутфорсивать несколько символов?
Нет, речь шла о раундах, а не полнораундовых итерациях, в шифровании, когда я не так понял вопрос.
Хэши устойчивы к повторениям. Вероятность снижения энтропии в цепочке хэшей из-за коллизий и получения циклов пренебрежимо мала при любом мыслимом числе итераций.
Мне был интересен случай повторения полной работы алгоритма. Спасибо!
Все верно, речь шла о раундах. Т.е. при увлечении итераций с напр 1 – 10 для получении конечного результата хеша приходится прогнать функцию 10 раз, не сделав этого никак не получится результат который используется в ключе... Таким образом атаки перебором все таки замедляются.
Как Вы оценили приблизительно кол-во бит? Ведь получить конечное значение хеша не зациклив его указанное число раз невозможно...
233=8589934592
http://lastpass.com/