Обычно парольная защита производится через веб-сервер, который проверяет пароль и выдаёт контент. Стандартный способ: .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. Есть веб-демо для шифрования в браузере (в офлайне).

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


  1. Spyman
    22.12.2024 19:18

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


    1. makkarpov
      22.12.2024 19:18

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


  1. pae174
    22.12.2024 19:18

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

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


    1. MrSmitix
      22.12.2024 19:18

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