ПОЧЕМУ ЭТО ВАЖНО. Большинство успешных атак вызваны человеческими ошибками. Мы совершаем ошибки, о которых иногда не замечаем.

  • Мы склонны использовать одни и те же учетные данные для многих порталов.
  • Мы храним пароли в открытых файлах.
  • Копируем пароли в буфер обмена.

Все это ОЧЕНЬ ПЛОХАЯ практика. Решение может быть простое — используйте соответствующие программы. Что, если мы сделаем что-то намного хуже?

УГЛУБЛЕНИЕ: Обычно программисты имеют доступ к службам с правами администратора. Я понимаю, что у нас ДОЛЖНЫ быть все необходимые инструменты для создания программы. Иногда мы не осознаем, что сливаем важную и секретную информацию.

  • Учетные данные для служб
  • Токены
  • 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. Чтение инструкций должно позволить новичкам легко запустить приложение.

Если вам понравилась история 👌 оставьте комментарий 🗯 и не забудьте похлопать 👏.