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