Защищены ли переменные времени компиляции в flutter?

#flutter #dart #security

Вопрос:

У меня есть некоторые конфиденциальные данные (секретный ключ api) для хранения в приложении на стороне клиента, я знаю, что это плохая практика для хранения такого рода информации, но на данный момент нет реальных альтернатив, я уже устраняю проблемы, которые могут возникнуть в случае утечки такого ключа, но я хочу знать, безопасно ли кодирование такого ключа в сборке во время компиляции или нет, в случае декомпиляции кода, даже если он запутан, сложнее ли повторно использовать переменную времени компиляции?

Вот пример того, как я бы его использовал

 flutter build apk --dart-define=APP_VERSION=0.1.2 --dart-define=SECRET_KEY=123456
 

Комментарии:

1. Вы можете, самое большее, запутать его, чтобы он не отображался в обычном тексте. Но если ваша программа может прочитать его (а она должна это сделать, чтобы использовать его), то и ваш злоумышленник может это сделать. Считайте, что ваш ключ просочился, как только вы опубликуете свою программу.

Ответ №1:

Это точно так же небезопасно, как и любой другой подход.

Создайте проект, в котором используется определение

(Если определение не используется, оно будет удалено, но, очевидно, вы хотите его использовать.)

 void main() {
  const String key = String.fromEnvironment('SECRET_KEY');
  print(key);
  runApp(const MyApp());
}
 

Строить

Я использую здесь «СЕКРЕТ», а не «123456», потому что в обычном APK много строк «123456», и это может дать ложный положительный результат.

 flutter build apk --dart-define=APP_VERSION=0.1.2 --dart-define=SECRET_KEY=SEKRET
 

Откройте APK

 cd build/app/outputs/flutter-apk/
mkdir app
cd app
unzip ../app-release.apk
 

Ищите секретные строки

 strings lib/x86_64/libapp.so | grep SEKRET
> SEKRET
 

Это ничем не отличается от простого жесткого кодирования строки в приложение. Нет никакой пользы в том, чтобы «скрыть» это в определении, и нет никакого способа действительно обезопасить это. Лучшее, что вы можете сделать, — запутать ситуацию и надеяться, что нападающий не очень мотивирован. Или инвестируйте в постоянные улучшения запутывания и укрепления каждый раз, когда они взламывают вашу систему. (Это очень сложно и дорого, и по своей природе не существует универсального или постоянного решения.)

Вы не можете скрыть ключ API в двоичном файле. Вы не можете скрыть ключ API, который приложение использует в памяти. Вы не можете надежно хранить секреты от кого-то, кто контролирует оборудование, на котором работает приложение, и мотивирован на то, чтобы найти эти секреты.

Комментарии:

1. Большое вам спасибо за ответ

2. Таким образом, в принципе, нет способа на 100% защитить эти секреты от мотивированного злоумышленника? То есть, если я использую GCP, мне нужно будет следить за своей учетной записью GCP и следить за хакером, использующим вычислительные ресурсы, после взлома моего приложения Flutter и получения ключа? Покрывает ли GCP эти виды потерь?

3. Как правило, вам не следует, чтобы ваше приложение напрямую связывалось со сторонней службой. Вы должны аутентифицировать его на своем собственном сервере, а затем подключить этот сервер к вашей сторонней службе. Тогда вы сохраняете контроль. Ни одна служба не собирается предлагать полное прощение мошенничества (хотя многие службы будут вести переговоры с вами, чтобы простить некоторые расходы, связанные с каким-либо одним крупным событием мошенничества). Если вы отправите свой ключ в своем приложении, его можно будет использовать. И в любом случае, вы абсолютно обязаны следить за любой услугой, за которую платите или за которую несете ответственность.