使用StringFog对字符串进行加密

StringFog

一款自动对dex/aar/jar文件中的字符串进行加密Android插件工具,正如名字所言,给字符串加上一层雾霭,使人难以窥视其真面目。

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

原理

StringFog 原理
  • 加密前:
String a = "This is a string!";
  • 加密后:
String a = StringFog.decrypt(new byte[]{-113, 71...}, new byte[]{-23, 53});

  • 运行时:
decrypt: new byte[]{-113, 71...} => "This is a string!"

混淆

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

使用

由于开发了gradle插件,所以在集成时非常简单,不会影响到打包的配置。插件已经上传到MavenCentral,直接引用依赖就可以。
jcenter已经废弃,3.0+版本取消发布

1、在根目录build.gradle中引入插件依赖。
buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        ...
        classpath 'com.github.megatronking.stringfog:gradle-plugin:3.0.0'
        // 选用加解密算法库,默认实现了xor算法,也可以使用自己的加解密库。
        classpath 'com.github.megatronking.stringfog:xor:3.0.0'
    }
}
2、在app或lib的build.gradle中配置插件。
apply plugin: 'stringfog'

stringfog {
    // 必要:加解密库的实现类路径,需和上面配置的加解密算法库一致。
    implementation 'com.github.megatronking.stringfog.xor.StringFogImpl'
    // 可选:加密开关,默认开启。
    enable true
    // 可选:指定需加密的代码包路径,可配置多个,未指定将默认全部加密。
    fogPackages = ['com.xxx.xxx']
    // 可选:指定密钥生成器,默认使用长度2的随机密钥(每个字符串均有随机密钥),
    //      也可以指定一个固定的密钥:HardCodeKeyGenerator("This is a key")
    kg new RandomKeyGenerator()
    // 可选:调试信息打印开关,默认关闭。
    debug true
}
3、在app或lib的build.gradle中引入加解密库依赖。
dependencies {
      ...
      // 这里要和上面选用的加解密算法库一致,用于运行时解密。
      compile 'com.github.megatronking.stringfog:xor:3.0.0'
}

扩展

注解反加密

如果开发者有不需要自动加密的类,可以使用注解StringFogIgnore来忽略:

@StringFogIgnore
public class Test {
    ...
}

自定义加解密算法实现

实现IStringFog接口,参考stringfog-ext目录下面的xor算法实现。
注意某些算法在不同平台上会有差异,可能出现在运行时无法正确解密的问题。如何集成请参考下方范例!

public final class StringFogImpl implements IStringFog {

    @Override
    public byte[] encrypt(String data, byte[] key) {
        // 自定义加密
    }

    @Override
    public String decrypt(byte[] data, byte[] key) {
        // 自定义解密
    }

    @Override
    public boolean shouldFog(String data) {
        // 控制指定字符串是否加密
        // 建议过滤掉不重要或者过长的字符串
        return true;
    }

}

自定义密钥生成器

实现IKeyGenerator接口,参考RandomKeyGenerator的实现。

Mapping文件

加解密的字符串明文和暗文会自动生成mapping映射文件,位于outputs/mapping/stringfog.txt。

范例

  • 默认加解密算法集成,参考sample1
  • 自定义加解密算法集成,参考sample2

更新日志

v3.0.0

  • 密文不再以String形式存在,改为直接字节数组,感谢PR #50。
  • 重构公开API相关代码(不兼容历史版本)。
  • 删除AES加密实现,考虑到存在bug和性能问题且意义不大。
  • xor算法移除base64编码。
  • 固定加密字符串key改为随机key,且提供IKeyGenerator接口支持自定义实现。
  • 插件依赖的ASM库由5.x升级到9.2。

你可能感兴趣的:(使用StringFog对字符串进行加密)