Как Conchshell хранит пароли и проверяет ключи хостов
Что делает хранилище, чего оно делать отказывается и где проходит граница. Формат описан до последнего байта.
Хранилище
Данные запечатаны XChaCha20-Poly1305. Ключ выводится через Argon2id из вашей парольной фразы, и у каждого способа разблокировки — фраза, связка ключей системы, код восстановления — свой слот, оборачивающий один и тот же ключ данных. Добавление или отзыв способа переписывает один слот; само хранилище не перешифровывается.
Интерфейс умеет создать запись и удалить запись. Прочитать обратно — не умеет. Не потому что чтение запрещено, а потому что команды, которая бы на такой вопрос ответила, не существует.
Привязка к маршруту
Сохранённая запись привязана ко всему маршруту, для которого её сохраняли: хост, порт, пользователь, цепочка прокси и промежуточный узел. Измените любое из этого — и запись не предложится, подключение спросит вас. Подменённое окно не может увести сохранённый пароль на другой сервер, потому что хранилище не отдаст его для маршрута, для которого он не сохранялся.
Ключи хостов
Первое подключение и смена ключа подтверждаются диалогом, который рисует операционная система, вне поверхности приложения. Приложение не может его перерисовать, не может нажать за вас и не может выдать подмену ключа за первое подключение. Это единственный запрос, который стоит читать внимательно, — поэтому это единственный запрос, который приложение не рисует само.