编译时变量在 flutter 中安全吗?

Fra*_*asa 8 security dart flutter

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

这是我如何使用它的示例

flutter build apk --dart-define=APP_VERSION=0.1.2 --dart-define=SECRET_KEY=123456
Run Code Online (Sandbox Code Playgroud)

Rob*_*ier 20

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

创建使用定义的项目

(如果未使用定义,它将被删除,但显然您想使用它。)

void main() {
  const String key = String.fromEnvironment('SECRET_KEY');
  print(key);
  runApp(const MyApp());
}
Run Code Online (Sandbox Code Playgroud)

建造

我在这里使用“SEKRET”而不是“123456”,因为普通 APK 中有很多“123456”字符串,它可能会给出误报。

flutter build apk --dart-define=APP_VERSION=0.1.2 --dart-define=SECRET_KEY=SEKRET
Run Code Online (Sandbox Code Playgroud)

打开APK

cd build/app/outputs/flutter-apk/
mkdir app
cd app
unzip ../app-release.apk
Run Code Online (Sandbox Code Playgroud)

寻找秘密字符串

strings lib/x86_64/libapp.so | grep SEKRET
> SEKRET
Run Code Online (Sandbox Code Playgroud)

这与将字符串硬编码到应用程序中没有什么不同。将其“隐藏”在定义中没有任何好处,并且没有办法真正确保这一点。你能做的最好的事情就是混淆视听,并希望攻击者的动机不是太强烈。或者在每次他们破解您的系统时投资于持续的混淆和强化改进。(这是非常困难和昂贵的,而且就其本质而言,没有普遍或永久的解决方案。)

您无法在二进制文件中隐藏 API 密钥。您无法隐藏应用程序在内存中使用的 API 密钥。您无法可靠地向控制应用程序运行硬件并有动力寻找这些秘密的人保守秘密。

  • 您通常不应该让您的应用直接与第三方服务对话。您应该让它对您自己的服务器进行身份验证,然后让该服务器与您的第三方服务通信。然后你就可以保持控制。没有任何服务会提供对欺诈的全面宽恕(尽管许多服务会与您协商以宽恕某些单一大型欺诈事件的部分费用)。如果您在应用程序中发送密钥,则可以使用它。无论如何,您绝对必须监控您付费或负责的任何服务。 (2认同)
  • 不将敏感秘密签入源代码管理(例如 git)绝对是有好处的。在开发和生产中不使用相同的秘密是有好处的。因此,任何需要开发人员/构建者在 .gitignore 并在构建时安装到工件中的文件(例如 .env)中本地提供机密的系统都比在源代码中包含机密更好。--dart-define 提供了一种在构建时将秘密添加到工件的方法,因此它们不需要成为源代码的一部分。 (2认同)