vPass 2 — простой и удобный генератор безопасных паролей на Javascript

    Привет,

    я потихоньку сделал версию 2 своего «потустороннего» проекта — vPass. Если интересно, вот тут в комментах интересное обсуждение первой версии.

    image

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

    vPass берет Ваш мастер-пароль (например, `my_password`) и, как правило, домен текушего сайта (например, `http://accounts.google.com` становится `google`) и создает набор из 12 букв, цифр и символов (например, `0EQu$MwEm?Qt`).

    Вот 30-секундный демо-ролик:



    Теперь Вы можете использовать уникальный пароль для каждого сайта, а запоминать надо только один мастер-пароль.

    Ваш мастер-пароль не покидает Ваш компьютер. vPass — это чистый Javascript, и не посылает данные на сервер. Работает везде, где есть браузер — Windows, Mac OS X, Linux, Android, iOS, Windows Phone, webOS и т.д.

    Букмарклет
    Перетащите эту ссылку → vPass ← на панель закладок.

    Для iPhone/iPad
    Откройте vPass в мобильном браузере, нажмите «Share», потом «Add to Home screen».

    Для Android
    Откройте vPass в мобильном браузере, добавьте закладку, откройте закладки, нажмите и подержите vpass.info, потом «Add to Home screen».

    Локальная копия
    Обязательно скачайте vPass на свой компьютер, для резервной копии: vpass.zip.



    • В букмарклете и расщирениях, «домен» заполняется автоматически, из адреса текущей страницы.
    • Наберите мастер-пароль и нажмите Enter.
    • Чтобы увидеть набираемый пароль (и избежать ошибок), жмите Ctrl(Cmd,Alt) + Enter.
    • Расширения Chrome & Safari автоматически вставят сгенерированный пароль в поле ввода на странице, если там будет курсор.




    Почему vPass, а не LastPass/KeePass/1Password/RoboForm/etc?
    Я попробовал их всех. Идеала не нашел. vPass — тоже не идеал, он просто отражает мой подход. Надеюсь, и Вам подойдет!

    Зачем вообще уникальные пароли?

    Насколько безопасен vPass?
    Ровно насколько безопасен Ваш мастер-пароль. А поскольку vPass вообще не популярен, никто не догадается, что Вы его используете.

    Как придумать хороший мастер-пароль?

    А если сайт vPass.info отключится?
    Поэтому надо хранить копию vPass. На сервере, кстати, отключены логи, и как я уже упомянул, я не получаю никаких данных со страниц.




    Коротко обо мне — я Влад Герасимов, и вот мой сайт — Vladstudio.com.
    Шлите ваши восхищения и ужасания по адресу vladstudio@gmail.com.

    vPass был вдохновлен SuperGenPass.




    Копия vPass v.1 тут — https://www.vpass.info/1/.




    UPDATE — из переписки —

    Вообще, должен прийти к грустному выводу. Я (собравшись воплотить все
    идеи для vPass 2), поисследовал тему более подробно, и сейчас пришел к
    грустному выводу, что смелая идея универсального генератора паролей,
    увы, не универсальна. На данном этапе «парольного бардака» (когда нет
    стандартов и каждый сайт придумывает свои требования к паролю)
    единственный нормальный метод — генерация случайного пароля для
    каждого сайта, подходящего к его требованиям, и хранение их в
    менеджере. Я был слегка наивен — хотя конечно получил интересный опыт,
    разрабатывая вПасс, и может быть все таки кому нибудь он как нибудь
    пригодится.

    Буду переходить на 1Password :(
    Поделиться публикацией

    Комментарии 32

      +4
      Опишите алгоритм генерации паролей.

      Зная пароль от сайта можно ли получить мастер пароль?
        +1
        Я взял one way encryption функцию y Christ West — gotochriswest.com/blog/2011/10/17/quick-javascript-encryption-method/
        Если знаете one way encryption функции лучше, срочно говорите :)
          +2
          Могу ошибаться, но мне кажется стоит посмотреть SHA3 (http://code.google.com/p/crypto-js/#SHA-3). А уже его вывод переводить в алфавит на котором сейчас генерятся пароли.
            0
            Отлично! Сделаю. Спасибо.
            +2
            лучше пользоваться стандартными проверенными методами (PBKDF2 etc), чем малоизвестными алгоритмами
            +1
            Можно, и не очень сложно.
            var chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split("");
            
            function encrypt(message, length) {
              // If the message is the empty string, return the empty string.
              if(message == "") {
                return "";
              }
            
              // Calculate the offset of the first character.
              var chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split("");
              for(var last = 0, i = 0, len = message.length; i < len; i++) {
                last = (message.charCodeAt(i) + 31 * last) % 59;
              }
            
              // Adjust for the specified length if it was given.
              length = length || message.length;
              while(len < length) {
                message += message;
                len += len;
              }
              message = message.slice(0, length);
            
              // Generate the encrypted string.
              for(var ret = "", i = 0; i < length; i++) {
                ret += chars[last = (i + last + message.charCodeAt(i)) % 64];
              }
              return ret;
            }
            
            function hackcrypt(last, message) {
              var len = message.length;
              for(var ret = "", i = 0; i < len; i++)
                ret += chars[last = (i + last + message.charCodeAt(i)) % 64];
              return ret;
            }
            
            function uncrypt(endata){
              var total = 0;
              for(var ll=59; ll; ll--){
                var ret = "", last = ll;
                for(var i=0,l=endata.length; i < l ; i++){
                  var next_symb = 0;
                  while( endata.substr(0, i+1) != 
                         hackcrypt(ll, ret + chars[next_symb]).substr(0, i+1) && 
                         next_symb < 64){
                      next_symb++;
                  }
                  total += next_symb;
                  if(next_symb == 64) break;
                  ret += chars[next_symb];
                }
                if(encrypt(ret) == endata){
                  console.log('Hash count: ', total, 'Password: ', ret);
                  break;
                }
              }
            }
            
            uncrypt('mWodQ3pVKgLE');
            


            Есть ситуации в которых он не отрабатывает, но, спасибо количеству коллизий, таких ситуаций не много. При желании можно дополнить алгоритм до гарантированного получения всех вариантов.
              0
              Уже добавил SHA3.
            0
            Плохо, что домен и мастер пароль просто склеиваются. в итоге пары foo/bar, fo/obar, f/oobar, fooba/r дают один и тот же ключ
              0
              А можно примеры из жизни, когда это плохо?
                0
                Не совсем тот вариант, который описывает Sirian, но есть момент с подобным нюансом работы: пароль для ресурсов с одинаковым доменным именем второго уровня будет одинаков. Например для сайтов «mail.by» и «mail.ru». Хотелось бы «зауникалиться» и в этом случае.
                  0
                  Мне ужасно неудобно, но я — наоборот — приложил некоторые усилия, чтобы отсекалось все, кроме «бренда» — потому что, например, amazon.com и amazon.fr имеют одинаковые логины, но разные tld.
                    0
                    Ну, в приведенном мной случае это, конечно, две почтовые системы, но абсолютно разных полей ягоды, никоим образом не связанные друг с другом.
                    Мне кажется, что было бы удобно как вариант в настройках использовать выбор — кодить на основе домена второго уровня или с учетом и первого.

                    Плюс еще ситуация, когда чисто теоретически злой дядька сфоткал мобилой мой пароль от хабра втихаря за спиной. Я это дело увидел, захотел сменить пароль. Получается нужно либо запоминать для хабра отдельный «мастер-пароль», либо сменить глобально на всех используемых мной ресурсах, чтобы как и раньше в памяти держать только один. Как вариант предлагаю по вторичному нажатию «Enter» выводить альтернативную версию пароля (допустим с некоторой «солью»). тогда не нужно ничего дополнительно менять или запоминать — не подошел с первого раза, используем альтернативный вариант.
                      +1
                      Мне еще более ужасно неудобно :-) но, как вы могли заметить, в вПассе вообще нет ни одной настройки. Это потому, что я тиран и самодур, и любая необходимость что-то настраивать меня расстраивает.
                      Необходимость менять все пароли при смене мастер-пароля — это недостаток этой идеи в принципе. Но я с ним подружился.
              +1
              Неплохо, но есть ведь supergenpass, который тоже работает из bookmarklet-a и у него есть настройки. Раньше пользовался им, потом пересел на LastPass из-за всяких дополнительных плюшек.
                +2
                Спасибо, как раз он меня как-то и натолкнул на эту идею. Мне интерфейс его не понравился. Работа с вПасс у меня занимает 3 клавиши, без мышки —
                — курсор на поле ввода пароля
                — Cmd-P (навесил shortcut на extension — Chrome уже это умеет, Settings — Extensions — Configure Commands)
                — набираю мастер-пароль
                — Enter
                — Esc
                  0
                  Ну ваш поудобнее, да.
                    +2
                    Для себя, любимого, делал :)
                    0
                    Есть плагин SuperChromePass (правда в github), который позволяет запомнить мастер пароль, достаточно одного клика мышью или нажать клавиатурное сочетание. При этом пароль можно и скопировать, что иногда приходится делать, например, если пароль требуется вводить в обычное поле ввода.

                    SuperGenPass формирует такие символы, которые точно везде проходят, не уверен, что в некоторых местах vPass 2 пройдёт валидацию пароля, что сводит его применение к нулю.

                    А почему выбрали другой алгоритм? Ведь можно было бы написать плагин под SuperGenPass, и получить совместимую вещь. Ведь если подсел на какой-то алгоритм, то с него будет очень сложно потом слезать. Я когда-то сделал для себя такую штуку, потом долго перебирался на другой алгоритм.
                  –1
                  На Android есть play.google.com/store/apps/details?id=krasilnikov.alexey.cryptopass&hl=ru

                  > Ваши пароли не хранятся где-либо, сохраняются только username и url, для удобства.
                  > password = base64(pbkdf2(secret, username@url))
                  > PBKDF2 использует SHA-256 и 5000 итераций. Пароль обрезается до требуемой длины (25 по умолчанию).
                    0
                    Проблему решают менеджеры паролей, но они, как правило, только под одну платформу.
                    но они, как правило, только под одну платформу.
                    О, правда? А как же мультиплатформенный keepass? Или кроссбраузерный LastPass?

                    А что делать в случае утечки мастер-пароля?
                      0
                      Я ж написал — как правило :) LastPass наиболее близок к моему идеалу, но не сдружились по разным причинам.
                      «А что делать в случае утечки мастер-пароля?» — то же, что и в случае утери пароля от LastPass — менять.
                        0
                        То есть менять пароли на всех сайтах?
                          0
                          Да. И вы, наверное, меня отругаете, но я подумал и решил не считать это (большим) недостатком. Час делов, в экстренном случае. Это цена за возможность нигде не хранить пароли.
                            0
                            Вообще, по-хорошему и в случае угона мастер-пароля от keepass или lastpass тоже надо бы поменять пароли везде. Так что, ваше решение таки стимулирует к хорошему. Только вот в таком случае надо ещё хранить где-то список сайтов. У меня в keepass их около 50. Все их за час не вспомнишь.
                              0
                              У меня их сотни :) И я просто по ходу дела жму им Forgot password. получаю ссылку, делаю новый.
                              Спасибо, что не отругали :)
                      0
                      KeePass (http://keepass.info) есть под кучу платформ. Windows, Android, iOS, Linux, Mac OS, J2ME, Windows Phone 7, Palm, BlackBerry — при условии хранения самой базы, например в DropBox — проблем не возникает.
                        0
                        Да, KeePass (+ LastPass) ближе, чем остальные, но по моему ощущению, сильно проигрывает в удобстве.
                        0
                        Остроумная идея, но на практике разбивается о нюансы, которых не счесть:

                        — Один и тот же логин на разных доменах (amazon/myhabit).
                        — Несколько логинов на одном сайте (почта, youtube etc.).
                        — Сайты, которые периодически требуют менять пароль (форумы, банки).
                        — Практически нереально сменить мастер-пароль.

                        Я когда-то делал то же самое, но алгоритм был в голове, намного проще, конечно. Потом надоело, ну и все недостатки все те же самые. Правда, «естественный интеллект» некоторые из них позволял успешно обходить, но все равно надоело.

                        Сейчас пользуюсь 1Password, тоже не 100% доволен, но это более универсальное решение, однозначно.
                          –2
                          Итак, я открыл страничку и набрал «habrahabr.ru/ukko», мне сгенерировался пароль, злоумышленник, зная что я пользуюсь этим генератором паролей зашёл на него и набрал те же самые «habrahabr.ru/ukko», тем самым пароль на 100% совпал.

                          Я правильно понимаю что именно такая последовательность действий и была задумана?
                            0
                            У вас еще есть мастер-пароль, который тоже участвует в генерации пароля.
                              0
                              Действительно, я затупил. Думал что в этом поле появится сгенерированный код.
                              0
                              Итак, я открыл страничку и набрал «habrahabr.ru/ukko», мне сгенерировался пароль, злоумышленник, зная что я пользуюсь этим генератором паролей зашёл на него и набрал те же самые «habrahabr.ru/ukko», тем самым пароль на 100% совпал.

                              Нет.

                            Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                            Самое читаемое