Планируя переезд в Грузию, я озаботился вопросом наличия двух загранпаспортов (нового и старого образца) еще за полгода до отъезда. Сделав один, я уже подался на второй, оплатил пошлину, мне его сделали, но я не успел его забрать и уехал на недельку отдыхать в Китай... где в самолете забыл свой единственный загранпаспорт. Но это история для отдельного поста. Вернувшись, мне пришлось отказаться от уже готового паспорта, и я так и не успел сделать загран нового образца, так что решил доделать всё уже в Тбилиси.
Это история о том, как я подался на получение загранпаспорта нового образца в консульство в Тбилиси, забыл кодовое слово для доступа к анкете на сайте zp.midpass.ru, перерыл весь код их фронтенда и вспомнил комбинаторику, чтобы восстановить это слово. А также готовый код для тех, кто попал в такую же беду и бот, который нажимает одну кнопку раз в день.
Что за кодовое слово?
При создании анкеты на загранпаспорт, вы должны придумать и запомнить кодовое слово для доступа к данным заявки. Это же кодовое слово будет спрашивать сайт каждый раз, когда вы нажимаете на любую из кнопок под заявкой (включая редактирование данных и просмотр).

Когда я через 2 недели после создания заявки зашел потыкать кнопочки, я понял, что забыл кодовое слово и ни один из вариантов не подходил. По скорости появления ошибки и отсутствию сетевых запросов, стало понятно, что все шифрование происходит прямо внутри браузера. Тогда я еще надеялся, что программисты из госструктур просто хранят мое кодовое слово где-нибудь в local storage в открытом виде, но как же я ошибался...
Как на самом деле все устроено
Первое, что я попытался сделать, это посмотреть сохраненные данные сайта

Системы аккаунтов на сайте нет: заходишь, создаешь заявку, она сохраняется в браузере. Вся информация, не скрытая под кодовым словом (ФИО, дата создания, id) в чистом json, а вот в зашифрованном Request#[uuid вашей заявки] хранятся сами данные заявления. Очевидно, данные в формате base64, так что пробуем декодировать:

На этом моменте я застрял на пару недель, потому что не знал, что делать дальше. Нужно было откопать кусок кода, который отвечал за шифрование и кодирование в base64 с помощью кодового слова. Не найдя в чатике людей, которые уже делали что-то подобное, я решил покопаться прямо в коде сайта и вскоре нашел, что искал:

this.cryptoProvider.decryptData(itemJson.data, passPhrase) === 'DecryptTestMessage'Эта строка кода расшифровывает то самое значение в base64 из localstorage, и если оно равно "DecryptTestMessage", значит кодовое слово правильное. Осталось найти cryptoProvider среди скомпилированного js.

