ПОЧЕМУ ЭТО ВАЖНО. Большинство успешных атак вызваны человеческими ошибками. Мы совершаем ошибки, о которых иногда не замечаем.
- Мы склонны использовать одни и те же учетные данные для многих порталов.
- Мы храним пароли в открытых файлах.
- Копируем пароли в буфер обмена.
Все это ОЧЕНЬ ПЛОХАЯ практика. Решение может быть простое — используйте соответствующие программы. Что, если мы сделаем что-то намного хуже?
УГЛУБЛЕНИЕ: Обычно программисты имеют доступ к службам с правами администратора. Я понимаю, что у нас ДОЛЖНЫ быть все необходимые инструменты для создания программы. Иногда мы не осознаем, что сливаем важную и секретную информацию.
- Учетные данные для служб
- Токены
- API-ключи
Если взломщик заберет их, они получат доступ ко ВСЕМ учетным записям, а не только к вашей.
КОНТЕКСТ. Недавно я сам совершил эту ошибку. Я разрабатывал библиотеку для одного из моих клиентов. Я хотел ВРЕМЕННО отправить КЛЮЧ API в репозиторий GitHub. К счастью, я сделал пиар, и это сразу заметили.
Мои намерения были хорошими. Я хотел удалить его позже. Но он все равно остается в истории.
- Я забыл о правиле «Делай как надо с первого раза».
- Безопасность похожа на страховку — вы жалеете, что у вас ее не было, когда все уже произошло.
- В большинстве случаев легко принять меры предосторожности.
ПЕРВОЕ РЕШЕНИЕ. Вы можете просто создать автономный класс, содержащий статическое поле с ключом API. Не забудьте добавить этот класс в файл .gitignore.
- Немедленная обратная связь — если класс не существует, он не скомпилируется.
- Важно, чтобы такой класс был хорошо назван.
ApiKey.kt
object ApiKey { const val API_KEY = “abc123” }
.gitignore
**/ApiKey.kt
ВТОРОЕ РЕШЕНИЕ: экспортируйте переменную среды. Имейте в виду, что такая переменная доступна только из той системы, для которой вы ее экспортировали. Вы не можете экспортировать его на Mac и прочитать в приложении для Android. Вместо этого вы должны предоставить его во время сборки.
- Предоставляется во время сборки, но вы узнаете, сделали ли вы это правильно во время выполнения (отсутствующая переменная среды приводит к значению "null", которое по-прежнему является строкой)
- Это РЕШЕНИЕ, если вы используете CI Server для создания своего приложения.
В зависимости от того, какую оболочку вы используете bash или zsh, существуют файлы сценариев конфигурации .bashrc и .zshrc соответственно.
- В MacOS они расположены в главном каталоге (`cd`)
- Создайте их, если они не существуют (`touch .zshrc`)
- Не забудьте перезагрузить скрипт или перезапустить Terminal/Android Studio, если необходимо (`source .zshrc`)
.zshrc
export API_KEY=abc123
build.gradle
android { … buildTypes { debug { buildConfigField `String`, `API_KEY`, "\"${System.getenv(‘API_KEY’)}\"" } } }
SampleActivity.kt
Library.initialize(apiKey = BuildConfig.API_KEY)
ИТОГОВАЯ СТРОКА: каким бы ни было решение, не забудьте задокументировать необходимые шаги в файле README.md. Чтение инструкций должно позволить новичкам легко запустить приложение.
Если вам понравилась история 👌 оставьте комментарий 🗯 и не забудьте похлопать 👏.