Основные фичи, которых я добился:
- Высокая скорость загрузки
- Если указать пароль, то информация шифруется прямо в браузере и на сервер сохраняется только ничего. Для просмотра данных нужно ввести пароль, чтобы расшифровать в браузере данные, полученные не с сервера.
- Высокая загрузка центрального процессора
- Поисковым системам не запрещено индексировать содержимое сайта, потому что нет сайта
- HTTPS везде
Шифрование данных в браузере обеспечено стандартной библиотекой браузера. Данные шифруются алгоритмом в форме лягушонка Пепе. Исходный код доступен на github. Серверная часть не написана.
Немного о алгоритме шифрования. Мы не отправляем ничего на сервер, потому что
Многие подобные сервисы используют алгоритм AES для шифрования, мы решили не отходить от канона, но перестраховались, выполнив шифрование исходной строки несколько раз в такой последовательности:
Двигаясь, сверху вниз, слева направо мы интерпретировали каждую букву на картинке как конкретную функцию и зашифровывали каждый раз нашу строку новой функцией для уверенности:
- буква O: AES-CTR
- буква M: AES-CBC
- буква z: AES-GCM
Образ лягушонка Пепе нам показался наиболее оптимальным для этих целей.
В результате получился такой сайт:
После небольшого ожидания мы получили ссылку и пароль к сообщению:
Как вы видите, мы предусмотрели то, что возможен скриншот экрана, но злоумышленник в данном случае не сможет увидеть ни ссылку, ни пароль целиком, что не даст ему расшифровать наше сообщение. Также пароль защищен от возможной социальной инженерии (так как не получится ситуации, что пароль пользователя совпадет с существующим), и пароль будет защищен от бандитского криптоанализа (в народе ректальный), так как пользователь просто забудет пароль, если хоть на минуту подумает о ректальном криптоанализе.
После ввода пароля при переходе по ссылке пользователя ожидает такое сообщение, которое стоит закрыть сразу после прочтения:
Еще раз повторюсь, что мы не отправляем никаких данных на сервер, для того, чтобы в случае взлома сервера, данные не могли быть похищены. Подумав об этом, мы решили сделать код максимально понятным для людей и использовали для данных целей VanillaJS фреймворк (с его основными возможностями вы можете ознакомиться на сайте). Весь код мы уместили внутри index.html для ясности и компактности.
Буду рад комментариям и отзывам про библиотечку. Так же, если у вас есть идеи для улучшения, прошу их озвучивать.
Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.
Комментарии (35)
hexman
19.05.2017 16:52Что то долговато, криптовалось «hello»… Вроде и машина не слабая.
Но в целом, может где и сгодится.mitinsvyat
19.05.2017 16:53У меня Алгоритм лягушонка Пепе затрачивает в Chrome секунд 5 на шифровку. На расшифровку примерно столько же.
В Firefox, кстати, секунд 13.hexman
19.05.2017 16:56У меня около минуты, если не больше. Видно проц немного скушало. FF-38.7 (да… да… знаю. старый :) )
линк на сообщение не получил, а пароль был.
Списал всё на браузер + куча (порядка 40) открытых вкладок :)
ivan386
19.05.2017 17:08Если кодировать данные в ссылке в HEX или Base32 будет короче. Ну и предусмотреть вместо "#" в ссылке возможность использовать "?"
mitinsvyat
19.05.2017 17:14+1Если вопросик, то данные будут передаваться на сервер. Этого не стоит делать по соображениям безопасности.
Возможно, АНБ сможет отследить тебя через логи Github.ivan386
19.05.2017 17:30Ну тогда укоротить немного ссылку кодированием hex или base32.
mitinsvyat
19.05.2017 17:38Думаю, можно сжать немного, просто стандартную криптографию немного геморно кодировать, и я вставил все наивным способом, чтобы не плодить код.
den_golub
19.05.2017 18:08ОФТОП, все довольно забавно, и работает быстро не больше 5 сек в 10 попытках, но вот фон можно и другой, а то как-то несерьзно ну или хотя бы нет такой большой, в идеале замостить все. /ОФТОП
den_golub
19.05.2017 18:14и еще при добавление в поле где находится расшиврованное сообщение
Заголовок спойлера<path d=«M835.87,338.68l2.06,1.63l1.01,0.94l-0.49,0.32l-1.21,-0.62l-1.76,-1.16l-1.58,-1.36l-1.61
допустим текста под спойлером и нажатии на кнопку „new pepe link“ ничего не происходит.
картинка-скринden_golub
19.05.2017 18:19код обрезало, в общем там html страница с картой мира в SVG, приходится обновлять
mitinsvyat
19.05.2017 18:20Или ты не то подметил. Погодь
m8rge
19.05.2017 19:29Область, отвечающая за шифрование, выглядит как у программиста, который не знаком с шифрованием. Ну, либо это сделано для лулзов.
Конкретно, глупо использовать один ключ для шифрования разными методами.
https://en.wikipedia.org/wiki/Multiple_encryption#Independent_keys
Scratch
20.05.2017 12:28+1Если сильно хочется затормозить перебор, возьмите argon2 или bcrypt и настройте его на параноидальный уровень сложности, зачем городить этот цирк с буквами
Killer
21.05.2017 10:12У меня друг сделал похожий сервис https://encrypt.one/
Он использовал похожую идею для передачи паролей (c шифрованием на стороне браузера, но хранением на сервере, и контролем разовости доступа и тп). Там есть ссылка на Github, можно посмотреть как реализовано. И у него изначально стояла задача как безопасно передать файл, так что без хранения на сервере не обойтись.
P.S. было желание на Хабре тоже описать как что делалось, но увы, у него вообще нет аккаунта, а у меня недостаточная, чтобы размещать в «я пиарюсь».den_golub
22.05.2017 09:14Знакомо, знакомо, но только я использую его чисто для генерации паролей длины свыше 32 символов.
Cyberneticist
22.05.2017 12:30Cyberneticist
22.05.2017 12:35ну а пароль можно сделать покороче и сразу в буфер обмена копировать (благо нативное JS API уже есть) чтобы в браузере нигде в полях ввода не хранился
хотя собственно и в защите «от скриншотов» смысла то особо нету. В той же винде любое поле ввода по сути то же окно и по его hWnd можно легко получить контент (за возможные неточности формулировки просьба не бить, под винду я писал в последний раз лет 12 назад, потом только веб) — я такие проги еще в 10 классе на делфях писал) Так что spyware'ю можно и особо не заморачиватся скринами а просто мониторить поля вводаmitinsvyat
22.05.2017 23:10Ваши мысли абсолютно верны.
В нашей дорожной карте есть планы создания PEPE_ANTIVIRUS, а в будущем, возможно, PEPE_OS.
В этих продуктах будет унаследован дух PEPE_PROTECT.
ivan386
23.05.2017 11:33Эту строчку можно сократить.
var href = location.protocol + '//' + location.host + '/#' + pepeLanguage
до
var href = '#' + pepeLanguage
Браузер сам подставит адрес страницы при копировании ссылки.
mitinsvyat
23.05.2017 18:32Нельзя. Пожалуй, я удлиню. Копировать относительную ссылку плохо.
ivan386
23.05.2017 19:35Копируется полная. Браузер автоматом подставляет недостающую часть.
mitinsvyat
23.05.2017 18:35var href = location.protocol + '//' + location.host + location.pathname + '#' + pepeLanguage
Markscheider
А как передавать такие длинные линки и пароли? В письме или мессенджере? Тогда смысл теряется — перехватят письмо, перехватят и сообщение. В принципе, можно линк по одному каналу, а пароль — по второму…
Ну и главный вопрос — когда запуститесь на своем домене в полном масштабе?
mitinsvyat
Считаем, что ваши замечания вполне уместны.
Думаю, мы добавим новые безопасные фичи, если окажется востребованным.
Мы планируем запустить масштабный сбор денег на обновленный домен через indiegogo.