使用 obfuscation 代码混淆保护你的 Flutter 应用程序

简介: 本文将会和大家说下保护代码的重要性,和如何给程序加上混淆编译功能。尽可能的不要在你的程序中写死各种服务秘钥,比如 oss 容易被盗用。

使用 obfuscation 代码混淆保护你的 Flutter 应用程序

视频

https://www.bilibili.com/video/BV1ui421i7Pv/

https://youtu.be/dlcuyav3Ta8

前言

原文 https://ducafecat.com/blog/securing-your-flutter-app-with-code-obfuscation

本文将会和大家说下保护代码的重要性,和如何给程序加上混淆编译功能。

尽可能的不要在你的程序中写死各种服务秘钥,比如 oss 容易被盗用。

参考

知识点

在 Flutter 项目中开启代码混淆有以下几个主要的好处:

  1. 提高应用安全性:
    • 代码混淆会对应用程序的源代码进行转换和混淆,使其更难被逆向工程和破解。这有助于保护应用程序的知识产权和商业机密。
    • 混淆后的代码不易被阅读和理解,降低了攻击者分析和篡改代码的风险。
  2. 减小APK文件大小:
    • 代码混淆可以通过缩短变量名、移除未使用的代码等方式来减小应用程序的大小。
    • 更小的APK文件意味着更快的下载速度和更高的用户体验。
  3. 提升应用性能:
    • 代码混淆通常会对代码进行优化,消除无用的调用和重复代码,从而提高应用程序的运行效率和性能。
  4. 隐藏程序结构:
    • 混淆后的代码不易阅读和理解,这使得攻击者更难分析应用程序的内部结构和工作原理。
    • 这对于保护关键算法和业务逻辑非常有帮助。
  5. 降低应用被篡改的风险:
    • 代码混淆会让攻击者更难定位和修改关键代码,从而降低应用被篡改的风险。
    • 这对于需要高安全性的应用程序非常重要,例如金融、支付等领域的应用。

了解逆向

这里我们以 android apk 文件举例,来说明混淆的必要性,如果你了解直接跳过本节。

先编译一个 release apk

flutter build apk --release

# 输出文件
build/app/outputs/flutter-apk/app-release.apk

下载 apktool 工具

https://apktool.org/docs/install

https://bitbucket.org/iBotPeaches/apktool/downloads/

macos 下直接 brew

brew install apktool

ios 下可以试试 class-dump 工具

解包

我们可以建一个 dump 目录,将 app-release.apk 文件放入

cd dump
apktool d app-release.apk -o output_dir

与 zip 解包的区别

  1. 还原编译过的资源文件:
    • APKTool 可以还原 APK 中经过编译的资源文件,如 Drawable、Layout、Values等,使得这些文件可以被直接编辑和修改。
    • 而直接使用 ZIP 解压,得到的只是原始的资源文件,无法进行深入的编辑和修改。
  2. 解码 Smali 代码:
    • APKTool 可以将 APK 中的 Dalvik 字节码文件解码为 Smali 汇编代码,方便逆向分析和修改应用程序的逻辑。
    • 直接解压 ZIP 得到的是原始的 Dex 字节码文件,需要使用其他工具如 dex2jar 才能进一步分析。
  3. 重新打包 APK:
    • APKTool 除了可以解包,还可以将修改后的 Smali 代码和资源文件重新打包成新的 APK 文件。
    • 直接使用 ZIP 解压缩无法直接重新打包,需要额外的步骤。
  4. 保留签名信息:
    • APKTool 在重新打包时会保留原 APK 的签名信息,无需重新签名。
    • 直接使用 ZIP 解压缩后重新打包,需要重新对 APK 进行签名。

apktool 可以重新打包 apk 文件哦!

逆向 lib/arm64-v8a/libapp.so 文件

工具还是很多 IDA Pro , objdump, radare2, Ghidra 。

dart_memory

initial_decompiled_code

结论

我们还是混淆下代码提升下应用安全。

混淆步骤

Android

android/app/build.gradle

    buildTypes {
   
   
        release {
   
   
            // TODO: Add your own signing config for the release build.
            // Signing with the debug keys for now, so `flutter run --release` works.
            signingConfig = signingConfigs.debug

            minifyEnabled true
            shrinkResources true
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
}

minifyEnabled true: 这个选项开启了代码混淆功能,会对应用程序的代码进行优化和缩减,以减小 APK 的大小并提高安全性。

shrinkResources true: 这个选项会删除未使用的资源文件,进一步缩小 APK 的大小。

proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro': 这里指定了 Proguard 规则文件的位置。Proguard 是一个代码混淆和优化工具,这些规则文件定义了如何对代码进行处理。

android/app/proguard-rules.pro

# Flutter Obfuscation
-ignorewarnings
-keep class io.flutter.app.** {
   
    *; }
-keep class io.flutter.plugin.** {
   
    *; }
-keep class io.flutter.util.** {
   
    *; }
-keep class io.flutter.view.** {
   
    *; }
-keep class io.flutter.embedding.** {
   
    *; }
-keep class io.flutter.embedding.engine.** {
   
    *; }
-keep class io.flutter.embedding.android.** {
   
    *; }
-keep class io.flutter.embedding.engine.plugins.** {
   
    *; }
-keep class io.flutter.plugin.common.** {
   
    *; }
-keep class io.flutter.plugin.platform.** {
   
    *; }

ignorewarnings: 忽略 ProGuard 在运行期间可能产生的一些警告信息。

-keep class * : 保留 * 包及其所有子包下的所有类和成员不被混淆。

执行打包

flutter build apk --release --obfuscate --split-debug-info=./build_info
Font asset "MaterialIcons-Regular.otf" was tree-shaken, reducing it from 1645184 to 1384 bytes (99.9% reduction). Tree-shaking can be disabled by providing the --no-tree-shake-icons flag when building your app.
Running Gradle task 'assembleRelease'...                           34.9s
✓ Built build/app/outputs/flutter-apk/app-release.apk (17.8MB)

IOS

build settings -> other swift flags 在 release 中加入 "-D DART_OBFUSCATION"

DART_OBFUSCATION

执行打包

flutter build ios --release --obfuscate --split-debug-info=./build_info

ios 需要配置好发布证书。

小结

在 Flutter 应用程序开发中,开启代码混淆是一个非常重要的步骤。它不仅可以提高应用的安全性,还能优化应用的性能和大小,降低被篡改的风险,最终带来更好的用户体验。开发者应该认真考虑在发布应用程序时启用代码混淆功能,以全面保护应用程序的安全和完整性。

感谢阅读本文

如果有什么建议,请在评论中让我知道。我很乐意改进。


flutter 学习路径


© 猫哥
ducafecat.com

end

相关文章
|
7月前
|
安全 数据安全/隐私保护 Android开发
Flutter应用程序加固的问题及解决方案
Flutter应用程序加固的问题及解决方案
124 0
|
存储 前端开发 文件存储
Flutter笔记:关于应用程序中提交图片作为头像
1. 头像选择与提交的一般步骤Flutter笔记关于应用程序中提交图片作为头像作者目 录1. 头像选择与提交的一般步骤2. 选择本地文件到头像的示例代码3. 将图像提交到后端1. 头像选择与提交的一般步骤image将处理后的图像作为用户的头像显示在应用程序中。您可以使用Image或小部件来加载和显示图像。这些步骤涵盖了从选择图像到上传、处理和显示图像的基本流程。请根据您的具体需求和后端实现来自定义这些步骤。此外,确保您的应用程序有适当的权限以访问设备上的相册或相机,这通常需要在和。
298 0
|
7月前
|
JSON Dart UED
Flutter 应用程序性能优化建议
Flutter应用程序默认已经具有良好的性能,因此您只需要避免常见的陷阱,就可以获得出色的性能。 您设计和实现应用程序的用户界面的方式可能会对其运行效率产生重大影响。 本文这些最佳实践建议将帮助您编写性能最佳的Flutter应用程序。
126 3
Flutter 应用程序性能优化建议
|
7月前
|
存储 安全 数据安全/隐私保护
Flutter应用程序的加固原理
Flutter应用程序的加固原理
112 0
|
存储 安全 数据安全/隐私保护
🚀Flutter应用程序的加固原理
在移动应用开发中,Flutter已经成为一种非常流行的技术选项,可以同时在Android和iOS平台上构建高性能、高质量的移动应用程序。但是,由于其跨平台特性,Flutter应用程序也面临着一些安全风险,例如反编译、代码泄露、数据泄露等问题。为了保护Flutter应用程序的安全性,开发者需要进行加固,提供更加安全的应用程序给用户使用。
|
安全 数据安全/隐私保护 Android开发
🚀Flutter应用程序加固的问题及解决方案
在移动应用开发中,为了保护应用程序的安全性,开发者需要对应用进行加固。在使用Flutter技术进行应用程序开发时,也需要注意应用程序的安全问题和加固方案。本文将介绍在Flutter应用程序加固过程中可能出现的问题,并提供相应的解决方案。通过学习本文,开发者可以更好地保护Flutter应用程序的安全性,提供更加安全的应用程序给用户使用。
|
前端开发 JavaScript 小程序
2022年为什么要使用Flutter构建应用程序?
2022年为什么要使用Flutter构建应用程序 一级目录 二级目录 三级目录 什么是Flutter? 为什么跨平台如此重要? 单个代码库,单个技术栈。 Flutter 擅长的地方 缩短上市时间 单个开发团队 降低开发成本 什么时候使用Flutter不方便? 想学习另一个技术? 自信地迁移到 Flutter
139 0
2022年为什么要使用Flutter构建应用程序?
|
开发工具 Android开发
AndroidStudio创建第一个 Flutter 应用程序
AndroidStudio创建第一个 Flutter 应用程序: 转到文件->新建flutter项目。
175 0
AndroidStudio创建第一个 Flutter 应用程序
Flutter 应用程序中使用 GridTile 小部件
本文将带您了解在 Flutter 应用程序中使用 GridTile 小部件的几个示例 GridTile 可以帮助我们快速轻松地创建具有丰富内容(文本、图像和图标的组合)的磁贴。此小部件通常与 GridView 小部件一起使用,但它可以用作独立组件。
256 0
Flutter 应用程序中使用 GridTile 小部件
|
容器
如何在 Flutter 应用程序中创建不同的渐变 【Flutter 专题 14】
Flutter 可用于创建漂亮的 UI。因此,在今天的文章中,我们将看到如何在应用程序中创建不同的渐变 。 开始吧 第 1 步: 创建一个新的 Flutter 应用程序。
314 0
如何在 Flutter 应用程序中创建不同的渐变 【Flutter 专题 14】