Android StringFog 字符串自动加密

2023-09-18 20:43:27

一、StringFog 作用

一款自动对dex/aar/jar文件中的字符串进行加密Android插件工具,正如名字所言,给字符串加上一层雾霭,使人难以窥视其真面目。可以用于增加反编译难度,防止字符串代码重复。

  • 支持java/kotlin。
  • 支持app打包生成的apk加密。
  • 支持aar和jar等库文件加密。
  • 支持加解密算法的自主扩展。
  • 支持配置可选代码加密。
  • 完全Gradle自动化集成。
  • 不支持InstantRun

github地址:GitHub - MegatronKing/StringFog: 一款自动对字节码中的字符串进行加密Android插件工具

二、效果

加密前:ToastUtils.showShort("Copied to clipboard")

加密后: ToastUtils.iIi1(IL.IL1Iii("njfbY/eJG2iyeMhm+51Zc7wqzw==\n", "3VirCpLtOxw=\n"), new Object[0]);

由于我还加了字典混淆,所以方法名这些也变了。但是字典混淆并不会替换字符串,所以又加了字符串加密,可以看到,反编译(jadx)后的代码,区别大的不行!

tips:

StringFog和混淆完全不冲突,也不需要配置反混淆,实际上StringFog配上混淆效果会更好!

三、实现过程

其实就是普通三方依赖接入的过程,个人在此做个总结,方便以后接入。

tips:官方已经有5.0.1版本了,但是有同事反馈有概率会有问题,所以还是用的4.0.1版本

1.项目/根目录的build.gradle 添加依赖

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        ...
        classpath 'com.github.megatronking.stringfog:gradle-plugin:4.0.1'
        // 选用加解密算法库,默认实现了xor算法,也可以使用自己的加解密库。
        classpath 'com.github.megatronking.stringfog:xor:4.0.1'
    }
}

2.在app或者你要使用的lib的build.gradle文件下配置

apply plugin: 'stringfog'

// 导入RandomKeyGenerator类,如果使用HardCodeKeyGenerator,更换下类名
import com.github.megatronking.stringfog.plugin.kg.RandomKeyGenerator
import com.github.megatronking.stringfog.plugin.StringFogMode

stringfog {
    // 必要:加解密库的实现类路径,需和上面配置的加解密算法库一致。
    implementation 'com.github.megatronking.stringfog.xor.StringFogImpl'
    // 可选:StringFog会自动尝试获取packageName,如果遇到获取失败的情况,可以显式地指定。
    packageName 'com.github.megatronking.stringfog.app'
    // 可选:加密开关,默认开启。
    enable true
    // 可选:指定需加密的代码包路径,可配置多个,未指定将默认全部加密。
    fogPackages = ['com.xxx.xxx']
    // 可选(3.0版本新增):指定密钥生成器,默认使用长度8的随机密钥(每个字符串均有不同随机密钥),
    // 也可以指定一个固定的密钥:HardCodeKeyGenerator("This is a key")
    kg new RandomKeyGenerator()
    // 可选(4.0版本新增):用于控制字符串加密后在字节码中的存在形式, 默认为base64,
    // 也可以使用text或者bytes
    mode StringFogMode.base64
}

我的配置是:

粘贴个图片,因为部分同事在接入的时候,不清楚这个东西该放哪儿。

3、在app或lib的build.gradle中引入加解密库依赖。

dependencies {
      ...
      // 这里要和上面选用的加解密算法库一致,用于运行时解密。
    implementation 'com.github.megatronking.stringfog:xor:4.0.1'
}

4.注意事项

从AGP 8.0开始,默认不生成BuildConfig,但是StringFog依赖此配置,请注意加上下面的配置。

android {
    // 注意请加上此配置
    buildFeatures {
        buildConfig = true
    }
    ...
}

同步项目的时候,记得去依赖库列表看库拉下来没得。不然你的第二步的stringfog配置会爆红,然后第二步的配置,部分是可选的配置,可以自己酌情删掉,此外,同步,rebuild的时候,多注意报错信息,根据报错去改,遇到麻烦可能会整挺久。 

 四、是否生效

依赖库接入成功后,并不是立马就在代码里看到加密后的字符串,那样子本地也读不懂代码了,更别提更改了。如何查看是否生效,则需要打包后,反编译查看代码。如果生效,那可以看到你的字符串已经完全读不懂了,没生效则还是原来的字符串,跟明显。

如果没生效,检查配置是否有问题,清理本地的缓存,重启android studio,更改debug/release等环境试一试。

五、反编译

使用的是Jadx:

GitHub - skylot/jadx: Dex to Java decompiler

六、坑

2023.9.20日补充

1.build新项目时,报错java.util.NoSuchElementException: Cannot access first() element from an empty Iterable。

看了下我的依赖库已经拉下来了,然后看了下对应版本

app的build.gradle

implementation 'com.github.megatronking.stringfog:xor:4.0.1'

项目下的build

classpath 'com.android.tools.build:gradle:7.4.0' classpath 'com.github.megatronking.stringfog:gradle-plugin:4.0.1' classpath 'com.github.megatronking.stringfog:xor:4.0.1'

gradle和stringfog是对应的呀,然后去谷歌也没得答案。但是自己琢磨也是适配的问题,因为这个配置用了好几次了

于是检查项目发现:这里面配置是8.0,那肯定不行的呀,我项目的gradle是7.4

于是改回7.5完美解决。

Gradle Wrapper 详解_Air Field的博客-CSDN博客

更多推荐

数据仓库介绍及应用场景

数据仓库(DataWarehouse)是一个用于存储、管理、检索和分析大量结构化数据的集中式数据库系统。与传统的事务处理数据库不同,数据仓库是为了支持决策支持系统(DecisionSupportSystems,DSS)和业务智能(BusinessIntelligence,BI)应用而设计的。数据仓库的核心概念事实表(F

mininum_snap

位置速度加速度====角度jerk=======角速度==========驱动力snap=====角加速度=========推力的导数凸优化算法convexoptimization凸优化(ConvexOptimization)是数学和计算机科学领域的一个重要分支,主要研究如何有效地解决凸优化问题。凸优化问题的主要目标是

LeetCode 接雨水 木桶理论、dp预处理

原题链接:力扣(LeetCode)官网-全球极客挚爱的技术成长平台题面:给定n个非负整数表示每个宽度为1的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。示例1:输入:height=[0,1,0,2,1,0,1,3,2,1,2,1]输出:6解释:上面是由数组[0,1,0,2,1,0,1,3,2,1,2,1]表示

一文搞定Postman(菜鸟必看)

什么是Postman?Postman是一个可扩展的API测试工具,可以快速集成到CI/CD管道中。它于2012年作为AbhinavAsthana的一个副项目启动,旨在简化测试和开发中的API工作流程。API代表应用程序编程接口,它允许软件应用程序通过API调用相互通信。为什么使用Postman?如今,Postman软件

微软推出统一 Copilot AI 助手;谷歌拟自主研发 AI 芯片;苹果拟在国内引进新的 OLED 供应商丨RTE开发者日报 Vol.55

开发者朋友们大家好:这里是「RTE开发者日报」,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享RTE(RealTimeEngagement)领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、「有看点的会议」,但内容仅代表编辑的个人观点,欢迎大家留言、跟帖、讨论。本期编辑:@Asu

【MySQL】数据类型

前言在前一篇文章中,我们介绍了数据库的基本操作,而在插入表时涉及了许多关于表的数据类型,接下来就一起来学习一下MySQL常见的一些文件类型吧。整形类型数据类型字节最小值最大值TINYINT1-128127UNSIGNEDTINYINT10255SMALLINT2-3276832767UNSIGNEDSMALLINT20

JUC第六讲:关键字volatile详解

JUC第六讲:关键字volatile详解相比Sychronized(重量级锁,对系统性能影响较大),volatile提供了另一种解决可见性和有序性问题的方案,本文是JUC第六讲,volatile关键字详解。文章目录JUC第六讲:关键字volatile详解1、带着BAT大厂的面试问题去理解volatile2、volati

安装Anaconda与pytorch,在IDEA中配置环境进行编程

1.官网下载与自己python版本匹配的Anaconda(注意,要想成功安装pytorch,python版本也要对应pytorch的相关版本)Anaconda官网最新版本与自己python版本不否请查找自己版本anaconda版本对应清华大学镜像下载2.安装时勾选添加环境变量或者手动添加(手动添加过程请自行查询)3.检

XMLHttpRequest介绍

目录一、介绍1.创建XMLHttpRequest2.初始化3.发送请求4.获取响应5.响应类型二、发送GET请求示例三、发送POST请求示例四、发送POST请求下载文件示例五、发送POST请求上传文件示例一、介绍1.创建XMLHttpRequestletxhr=newXMLHttpRequest();2.初始化xhr.

大数据知识点之什么是大数据

大数据(bigdata),指无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合,是需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产。简单理解就是:那些数据量很大、增长速度很快,数据结构和样式复杂,传统数据库很难存储、处理,传统方法很难分析的信息。大数据是信息资

第七章 查找 六、平衡二叉树

目录一、定义二、最小不平衡子树1、平衡方法2、查找效率三、插入、删除操作平衡二叉树的插入操作:平衡二叉树的删除操作:1、例子1(1)若我们要删除9(2)若我们要删除552、例子2​编辑一、定义平衡二叉树是一种特殊的二叉树,具有如下性质:它是一棵空树,或者它的左右两个子树的高度差的绝对值不超过1,并且其左右两个子树都是平

热文推荐