dchest / cryptopass

Chrome extension: password generator from master key using PBKDF2 with SHA-256.
https://chrome.google.com/webstore/detail/hegbhhpocfhlnjmemkibgibljklhlfco
18 stars 9 forks source link

[RESEARCH] Усилить, ускорить, сделать удобнее #2

Closed sergeevabc closed 9 years ago

sergeevabc commented 9 years ago

Интересуюсь переходом с Password Generator на ваш Cryptopass.

Чего не хватает в последнем:

Дмитрий, вы могли бы внести соответствующие изменения?

dchest commented 9 years ago
  1. Последняя версия использует sjcl вместо Crypto-JS и довольно быстрая. Можно переключить на мою https://github.com/dchest/fast-sha256-js — она быстрее обеих [upd: попробовал, по ощущениям, не быстрее sjcl для 5000 итераций] — но не вижу смысла, потому что и так почти моментально срабатывает даже на нетбуке с Atom CPU. У вас нет?
  2. Меня тоже это раздражает, но я не знаю, почему в Chrome такая задержка происходит (у других расширений вроде то же самое). Буду рад исправить, если кто-нибудь подскажет как.
  3. Сохранять секрет не хочется. Сейчас при закрытии попапа, Chrome убивает его процесс. Если сохранять секрет, нужно либо писать его в какое-нибудь хранилище, либо расширение держать в памяти, а это дополнительный вектор для атак.
sergeevabc commented 9 years ago
  1. Извините, Дмитрий, имел в виду Crypto-JS не в расширении, а на сайте.
  2. Вы заглядывали в исходники Password Generator? Там — моментальный popup.
  3. Там же можно подсмотреть, как реализовано сохранение в памяти до закрытия браузера. Для пользователя это лишь переключатель: не сохранять/сохранять в памяти/сохранять на диске. Последнее, очевидно, лишнее, а второе — компромисс между паранойей и удобством.
  4. Смущает метка Max length X characters. Почему не просто Length? При текущем написании кажется, что пароль может выйти и короче. Как вот на спидометре автомобиля указана максимальная скорость 250 км/ч, но обычно стрелка плавает в районе 100 км/ч.
  5. Какой набор символов участвует в генерации: A-Z/a-z/0-9 и что-то ещё?
  6. Генерация включает PBKDF2-HMAC-SHA256, верно? (Сейчас указано PBKDF2-SHA256.)
  7. Как получается, что использование в Cryptopass медленного по дизайну PBKDF2 практически не создаёт задержек и по скорости выходит примерно, как и обычный SHA256 в других решениях? Всё ли дело в грамотном яваскрипте и малом (5000) количестве итераций? Например, проект Hash0 использует аж 100 000 итераций.
dchest commented 9 years ago
  1. Извините, Дмитрий, имел в виду Crypto-JS не в расширении, а на сайте.

А, понял. Да, это давно не обновлялось.

  1. Вы заглядывали в исходники Password Generator? Там — моментальный popup.

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

  1. Там же можно подсмотреть, как реализовано сохранение в памяти до закрытия браузера. Для пользователя это лишь переключатель: не сохранять/сохранять в памяти/сохранять на диске. Последнее, очевидно, лишнее, а второе — компромисс между паранойей и удобством.

ОК, подумаю. Все-таки браузер — страшная вещь, лучше все убивать (память, процессы) как только есть возможность :)

  1. Смущает метка Max length X characters. Почему не просто Length? При текущем написании кажется, что пароль может выйти и короче. Как вот на спидометре автомобиля указана максимальная скорость 250 км/ч, но обычно стрелка плавает в районе 100 км/ч.

Согласен. Забыл почему именно "max", но должен точно выдавать.

  1. Какой набор симолов участвует в генерации: A-Z/a-z/0-9 и что-то ещё?

Base64: A-Z a-z 0-9 + /

  1. Генерация включает PBKDF2-HMAC-SHA256, верно? (Сейчас указано PBKDF2-SHA256.)

Да.

  1. Как получается, что использование в Cryptopass медленного по дизайну PBKDF2 практически не создаёт задержек и по скорости выходит примерно, как и обычный SHA256 в других решениях? Всё ли дело в грамотном яваскрипте и малом (5000) количестве итераций? Например, проект Hash0 использует аж 100 000 итераций.

5000 — это сейчас очень мало. Такое количество выбиралось, потому что раньше компьютеры, JavaScript-движки и имплементации PBKDF2-HMAC-SHA256 были медленными. Сейчас я бы перешел на scrypt: моя JavaScript-версия, я замерял, лучше даже нативного PBKDF2 при одинаковом времени выполнения (scrypt использует много памяти). Я делал новый проект, который использовал бы scrypt, но не доделал, так как понял, что обычный менеджер паролей с хранилищем для меня удобнее, чем генератор.

sergeevabc commented 9 years ago

Спасибо за пояснения, Дмитрий.

Правда, под конец стало как-то грустно, прям в тональность свинцового осеннего неба за окном, а так хочется света, надежды, импортозамещения и развития. Т.е. порвать с заокеанскими Lastpass, Dashlane и иже с ними, доверить самое-самое Keepass’у, а для остальных авторизаций из дома и в дороге использовать генератор — лучший из возможных (по надёжности, быстроте и удобству).

Перепробовал всё, что энтузиасты от безопасности разместили в Chrome Webstore и счёл, что вы продвинулись дальше остальных, но требуется обновление. Как же быть?

dchest commented 9 years ago

Импортазамещения? Это тогда надо ГОСТ Р 34.11-2012 вместо SHA-256 :laughing:

Может попробуете уговорить автора https://github.com/eterevsky/passwordgen добавить scrypt?

sergeevabc commented 9 years ago

Добавить Scrypt не проблема, сложно допилить интерфейс, ибо для подсчёта SHA256 требуется один набор настроек, а для Scrypt — другой. Да и людей смущает ваше же заявление про альфа-версию, «которую лучше не применять для серьёзных вещей».

Разработчик PasswordMakerPro, утяжелённой версии Passwordgen'a, вообще упёрся рогом, мол, если и добавит, то SHA3 и попозже, а в использовании PBKDF2, Bcrypt, Scrypt — толка не видит.

Нашлось решение OneShallPass, где применяют аж PBKDF2-HMAC-SHA512 и подробно описывают весь процесс (вас может заинтересовать), однако расширение для Хрома оставляет желать лучшего. Просишь улучшить — молчат.

Кстати, по поводу немедленного появления popup, приглядитесь к содержанию файлов manifest.appcache, manifest.json и manifest_app.json. В них используются инструкции вроде background, cache, offline_enabled, persistent, storage. Возможно, задержка появления Cryptopass связана именно с необходимостью каждый раз подсасывать ресурсы.

И хотя вы поспешили закрыть тикет, но я не теряю надежды, что Cryptopass рано списывать в утиль и он ещё может послужить делу. Дмитрий, в первом приближении предлагаю:

dchest commented 9 years ago

Разработчик проекта, во многом аналогичного Passwordgen'у, вообще рогом упёрся, мол, если чего и добавит, то SHA3 когда-нибудь, а в PBKDF2, bcrypt, scrypt — толка не видит.

Да уж, SHA-3 совершенно не подходит для паролей. Советую его отправить сюда почитать: https://password-hashing.net/faq.html

И хотя вы поспешили закрыть тикет, но я не теряю надежды, что Cryptopass рано списывать в утиль.

по внешнему виду переименовать Secret в Masterkey, Max. Length в Length

Открыл тикет про Max Length https://github.com/dchest/cryptopass/issues/3, попозже займусь. С Secret не согласен, пусть будет secret-ом :-)

не показывать красную надпись про минимум 16 символов при нажатии на Show, если символов больше 16 (ведь их по умолчанию выходит 25)

Эта надпись — про количество символов в Secret, а не в полученном пароле. 16 символов английского алфавита дают lg(26)*16 = ~75 бит энтропии, что уже не очень хорошо, а меньше 16-ти — не очень секьюрно.

по содержанию — увеличить [количество итераций][6] до 100 000 и скорости ради переключиться на вашу библиотеку Fast-sha256-js.

Так как это сломает обратную совместимость, я лучше в качестве опционального алгоритма добавлю scrypt: https://github.com/dchest/cryptopass/issues/4

А может и нет :) https://github.com/dchest/cryptopass/issues/5

dchest commented 9 years ago

Да и людей смущает ваше же заявление про альфа-версию, «которую лучше не применять для серьёзных вещей».

Действительно, убрал надпись https://github.com/dchest/scrypt-async-js/commit/002843760aca5e75e878d17a7d6ea840b763a8b6. scrypt-async-js уже используется, например, в miniLock.

sergeevabc commented 9 years ago

Minilock лапочка, сработана по уму и сексуально упакована. Образец!

Тем временем натыкаюсь на ещё один генератор, звать Getvault. И вновь сокрушаюсь, разве что настройка символьной кассы сделана интересно, гарантируя aA% в каждом результате.

Казалось бы, что мешает вывести и реализовать наиболее здравую формулу на ближайшие годы? Всё какие-то полумеры, дыхание в одну ноздрю, выдумывание колеса…

sergeevabc commented 9 years ago

Симпатичный генератор SaltThePass.com, уже использующий SHA3. Но как! Алгоритм: x = Trim(Base64(SHA3(Masterkey + Domain Name + Domain phrase))). Вспоминается немецкий Shapass: x = Base64(SHA-512(Masterkey + Space + Service name))..

sergeevabc commented 9 years ago

Дмитрий, обратите внимание на проект Triplesec (демо). Используют всё самое последнее.

sergeevabc commented 9 years ago

Доброго вечера, коллега! Спешу поделиться новостями.

  1. Забрезжил свет в конце тоннеля с появлением Masterpasswordapp.com на базе Scrypt HMAC SHA256. Автор подробно описывает алгоритм и сценарии использования. Увы, всё это для мобильных устройств и с помощью Java — на компьютерах. Общаемся о Javascript версии.
  2. Пока вы освежаете Cryptopass, мне приглянулся BPasswd2 на базе Bcrypt HMAC SHA256. Подрезав свистульки авторской версии, вылепил однофайловую, nobullshit edition. Работать работает, однако есть претензии по mapping и пределу в 30 символов на итоговый пароль.