Хранение пароля хранилища ключей для закрепления сертификата в Android
Недавно я начал узнавать о безопасности в приложениях для Android и хотел реализовать закрепление сертификатов. Нашел некоторую полезную информацию, погуглив, но я наткнулся на хранение пароля хранилища ключей, который содержит сертификат сервера.
Поскольку я не могу доверять файловой системе Android, чтобы сохранить свой пароль хранилища ключей в секрете, главным образом потому, что любой пользователь с правами root сможет в конечном итоге его откопать, я начинаю задумываться, действительно ли это необходимо для надежного хранения этого пароля хранилища ключей или нет потому что это хранилище ключей будет содержать только SSL-сертификат моего сервера, который должен быть общедоступным.
Я не могу думать о любой злонамеренной атаке, если кто-то может декомпилировать мою APK
и увидеть пароль хранилища ключей, поскольку злоумышленник не сможет изменить какой-либо код приложения и, таким образом, изменить, например, целевой сервер IP
или даже изменить хранилище ключей, переключив мой сертификат с каким-либо другим вредоносным сертификатом, который в сочетании с изменениями, которые злоумышленник мог внести в целевой IP
, заставит приложение работать с любым вредоносным сервером ( атака "человек посередине").
Я нашел довольно хороший пример закрепления сертификата в Android здесь, на github, но, к сожалению, автор не заботится о надежном хранении пароля, так как он жестко закодирован в MainActivity
,
Итак, мой подытоженный вопрос: действительно ли нужно защищать пароль хранилища ключей, если это хранилище ключей имеется только внутри предполагаемой публичной SSL
сертификат сервера?
Из проведенного мною исследования я обнаружил, что по этому вопросу ФП рассматривает возможность прохождения null
в качестве пароля на код Android. Может быть, я мог бы пойти с этим и сохранить пароль хранилища ключей на моем сервере, а не упаковывать его в приложении для Android.
Также во время поиска в Google я нашел довольно полезные статьи, которые могут быть интересны для любого, кто изучит этот вопрос в будущем:
- Прикрепление сертификатов в Android объясняется просто
- Надежное хранение информации в Android
- Android Keystore для хранения ключей (ВНИМАНИЕ, любой root- пользователь может найти информацию, хранящуюся здесь)
Обновление прогресса - Проход null
в качестве пароля хранилища ключей (как я уже упоминал выше в качестве одного из вариантов), если вы установили его при генерации, это приведет к обходу хранилища ключей: запросы все равно отправляются, а пользовательское хранилище ключей ничего не делает. Никаких исключений не выдается или что-то еще, это просто работает, как будто вы не установили никакого пользовательского хранилища ключей.
KeyStore trustStore = KeyStore.getInstance("BKS");
trustStore.load(keyStoreInputStreamFromResources, null);