编译时变量在 flutter 中是否安全?

Are compile-time variables secure in flutter?

我有一些敏感数据(api 密钥)要存储在客户端的应用程序中,我知道存储此类信息是一种不好的做法,但不可行现在的替代方案,我已经在篡改如果此类密钥泄漏可能出现的问题,但我想知道在编译期间在构建中对此类密钥进行编码是否安全,以防反编译代码,即使混淆, 是否更难检索编译时变量?

这是我将如何使用它的示例

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

这与任何其他方法一样不安全。

创建使用定义的项目

(如果不使用define,它会被剥离,但显然你想使用它。)

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

建造

我在这里使用“SEKRET”而不是“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 键。对于控制运行该应用程序的硬件并有动力去寻找这些秘密的人,您无法可靠地保守秘密。