Обычно парольная защита производится через веб-сервер, который проверяет пароль и выдаёт контент. Стандартный способ: .htaccess и htpasswd. Но что, если нужно выложить зашифрованную веб-страницу и файлы на публичном хостинге, где у нас нет контроля над сервером? Эту проблему решают инструменты StatiCrypt и Portable Secret.

Для шифрования HTML перед публикацией StatiCrypt использует AES-256 и WebCrypto, а расшифровка происходит с помощью ввода пароля в браузере на стороне клиента, как показано в демо (пароль test).

StatiCrypt генерирует статическую страницу, которую можно безопасно заливать на любой хостинг, в том числе бесплатный сторонний хостинг, такой как GitHub Pages.

Страница будет расшифрована в браузере посетителя, когда тот введёт известный ему пароль. В принципе, эту систему можно использовать для шифрования личных заметок, если вы хотите выложить их на общедоступный сервер, чтобы всегда иметь к ним доступ, но при этом надёжно защитить от посторонних глаз.

Расшифровка происходит на обычном JavaScript, то есть со стороны клиента не требуется скачивание и установка дополнительных инструментов, кроме стандартного браузера. Ни хостинг-провайдер, ни интернет-провайдер не получают доступ к этой информации в процессе расшифровки её расшировки в браузере.

Проверить шифрование можно в веб-версии StatiCrypt. Сверху поля для исходного HTML и пароля:



Снизу — результат с зашифрованным HTML:



Есть даже веб-редактор для HTML и различные опции оформления интерфейса:



Консольная утилита StatiCrypt доступна для скачивания на Github, а также в виде пакета NPM. В консольной программе настройка интерфейса для поля ввода пароля производится изменением шаблона lib/password_template.html в комплекте утилиты с указанием потом пути к шаблону через флаг -t path/to/my/file.html. Важно только не изменять фрагмент шифрования в этом шаблоне, в том числе формат переменных /*[|variable|]*/0 с обязательным нулём на конце.

Существует готовый шаблон для создания и хостинга одностраничного зашифрованного сайта на GitHub Pages.

По умолчанию поле ввода пароля содержит флажок «Запомнить меня» (Remember me). В этом случае пароль хранится в localStorage (в хешированном виде с солью). Опять же по умолчанию нет срока хранения пароля. Для отключения данной опции при генерации страницы из консоли можно использовать флаг --remember false. Срок хранения в днях указывает опция --remember NUMBER_OF_DAYS.

Страница шифруется с помощью AES-256 в режиме CBC, который в контексте StatiCrypt лишён характерных для него уязвимостей. Пароль хешируется с помощью функции PBKDF2: 599 тыс. операций хеширования SHA-256 и 1000 операций SHA-1 (для легаси), что составляет рекомендуемой значение 600 тыс. операций.

По сути, генерируется новая веб-страница (зашифрованная), которая вмещает содержимое старой.

Для наилучшей безопасности рекомендуется использовать пароли длиной более 16-ти символов (буквы, цифры, спецсимволы) и менеджер паролей. Например, опенсорсный Bitwarden. Хотя AES-256 считается надёжным современным шифром, но для лучшей защиты от брутфорса лучше использовать пароли как можно большей длины.

Утилита также умеет генерировать ссылку, которая уже содержит хешированный пароль, для доступа к странице без ввода пароля непосредственно в веб-форме браузера. Такую ссылку можно передавать доверенным лицам или использовать самому, а контент при этом хранится на сервере в зашифрованном виде, недоступном для просмотра ни хостером, ни третьими лицами.

Похожий проект, но для шифрования файлов — Portable Secret. Его можно использовать для шифрования конфиденциальных файлов, которые хранятся в небезопасном месте: на USB-флешке, облачном хостинге, на веб-сайте и т. д. А также для шифрования файлов перед отправкой по открытому каналу: по почте или в мессенджере. В принципе, это современная удобная альтернатива PGP. Есть веб-демо для шифрования в браузере (в офлайне).

Комментарии (22)


  1. Spyman
    22.12.2024 19:18

    Учитывая что расшифровка будет происходить локально и почти мгновенно, то интересно - насколько при современных вычислительных мощностях будет устойчив 16-символьный пароль. Наверняка можно приспособить какую нибудь cuda и перебирать ооочень быстро, а верефицировать по наличию валидных тегов например.


    1. makkarpov
      22.12.2024 19:18

      Если используется правильная криптография - то этап преобразования пароля в ключ специально делают очень ресурсоемким как раз против этого. Причём не только по вычислениям, а еще и по объему требуемой памяти. Условно, расшифровка самого текста может занимать миллисекунду, а восстановление ключа для неё из пароля - секунду и требовать 128 мегабайт быстрой памяти. Примеры - scrypt, argon2.


    1. SanSYS
      22.12.2024 19:18

      Буквально на днях по фану то же самое делал и соль в том, как остальные 4 аргумента будут заданы для PBKDF2, например число итераций – существенно замедляет перебор, думаю не большая проблема для пользователей даже если задержка на обработку одного пароля составит более секунды


    1. orekh
      22.12.2024 19:18

      16 символов 64-значного алфавита - это 2 в степени (16 * 6) паролей. 4090 расчитывает 30 мегахэшей в секунду PBKDF2. Итого, делим первое на второе и получаем примерно 10^11 лет, что примерно в 6 раз больше возраста вселенной. Это без учёта времени необходимого на расшифровку AES-256 и проверку что расшифровалось что-то осмысленное.


  1. pae174
    22.12.2024 19:18

    насколько при современных вычислительных мощностях будет устойчив 16-символьный пароль

    Если ваши вычислительные русурсы позволяют перебирать один триллион хэшей в секунду, то на полный перебор всех возможных 16-значных комбинаций [a-zA-Z0-9] у вас уйдет примерно 1.5 миллиарда лет. Триллион хэшей в секунду, возможно, могут выдать только все суперкомпьютеры из списка Топ500 суммарно.


    1. MrSmitix
      22.12.2024 19:18

      Главная уязвимость - это люди. Берём список из самых популярных паролей и поехали)


      1. YegorP
        22.12.2024 19:18

        Берём список из самых популярных паролей и не даём их устанавливать.


      1. rznELVIS
        22.12.2024 19:18

        "Берём список из самых популярных паролей" и добавляем к ним год рождения админа или опса


      1. SanSYS
        22.12.2024 19:18

        Кстати говоря, не обязательно иметь этот список, достаточно лишь проверить, как часто пароль фигурирует в утечках и отвергать те, что более N раз попадались, см. https://haveibeenpwned.com/API/v3#SearchingPwnedPasswordsByRange

        Хотя да, локально список для ускорения - норм оптимизация


    1. Metotron0
      22.12.2024 19:18

      Искомый хеш, скорее всего, будет где-то в середине. Все перебирать не придётся. Делите ожидаемое время на два. Но это, конечно, среднее время при переборе множества паролей. А если найти нужно только один хеш, то он может оказаться и последним в списке, но и первым тоже.


      1. pae174
        22.12.2024 19:18

        Злоумышленник не знает заранее какого размера ломаемый пароль. Поэтому перебирать он будет сначала пароли минимально допустимого размера, наращивая размер на каждой следующей итерации. Так что до того, как он начнет перебирать все 16-знаки, ему сначала надо будет перебрать все 15-знаки (24 миллиона лет), а еще раньше надо будет перебрать все 14-знаки (390 тысяч лет), ну и так далее.


        1. funca
          22.12.2024 19:18

          15-ти значные это 1/10 часть 16-ти значных, что гораздо меньше половины.


        1. Metotron0
          22.12.2024 19:18

          Зачем перебирать пароли? Он будет перебирать сразу конечные хеши.


          1. dreesh
            22.12.2024 19:18

            Тут хеш соленый, а значит нет готового "конечного хеша" для предполагаемого пароля.


            1. Metotron0
              22.12.2024 19:18

              Он же хранится в localStorage, насколько я помню статью, поэтому не важно, какой пароль, нужно просто положить в хранилище правильнй хеш.


              1. orekh
                22.12.2024 19:18

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


                1. Metotron0
                  22.12.2024 19:18

                  Я не про замену соли, я про подбор хеша вместо подбора ключа, раз уж ключ так долго генерировать.


          1. pae174
            22.12.2024 19:18

            Зачем перебирать пароли? Он будет перебирать сразу конечные хеши.

            Для экономии времени. Количество всех возможных хэшей существенно больше количества всех возможных 16-значных случайных паролей. В AES-256 возможно примерно 1e77 ключей, а паролей вида [a-zA-Z0-9]{16} "всего" примерно 1e28.


            1. Metotron0
              22.12.2024 19:18

              Ну, 16 — это только рекомендация, он может быть длиньше. Или короче. Однако, как выше заметили, стоит учитывать затрачиваемое время на генерацию хеша из пароля. Требуются более детальные подсчёты.


              1. orekh
                22.12.2024 19:18

                Есть физические ограничения, человечеству просто не хватит ни времени, ни энергии внутри солнечной системы, чтобы лишь пересчитать числа от 0 до 2 в 128 степени. Если я правильно расчитал, то до потухания Солнца мы сможем передвинуть лишь 2 в 112 степени битов. Ни о каких полных переборах 256-битных ключей речи быть не может.


                1. Metotron0
                  22.12.2024 19:18

                  Тогда остаётся только перебор пароля по словарю.


  1. alexnozer
    22.12.2024 19:18

    Использовал StatiCrypt для ограничения доступа к статическому сайту (собран с помощью Eleventy). Полезная штука для Jamstack-сайтов.