Giter Site home page Giter Site logo

xiangyutian / aesjniencrypt Goto Github PK

View Code? Open in Web Editor NEW

This project forked from brucewind/aesjniencrypt

0.0 2.0 0.0 235 KB

ndk实现AES加密,key存在native中,再做一层防止被二次打包的签名校验。(长期维护,请star,勿fork)

License: GNU Lesser General Public License v2.1

CMake 1.73% Java 5.44% C 91.93% Shell 0.19% Makefile 0.71%

aesjniencrypt's Introduction

追求极致的代码安全性保障

  • ndk实现AES加密
  • 使用JniOnload 隐藏c函数
  • 再做一层防止被二次打包的签名校验
  • key存在符号表中,同时隐藏字符表 该方案已经废弃,请看下一条
  • 手工处理隐藏key,最复杂的方案:将密钥分成不同的几段,存储在不同的代码中,最后将他们拼接起来,可以将整个操作写的很复杂,增加逆向难度。(目前代码里用的是稍微简单的方案)
  • 使用obfuscator混淆C的代码,关于破解obfuscator
  • 增加obfucator对x86的支持,具体配置obfucator的教程底部有链接。
  • 反动态调试 , 目前代码里是比较简单的方案, 有更复杂更高明的方案,比如:不用这个ptrace而是每次执行加密解密签先去判断是否被trace,想要更复杂的自己fork之后去写
  • 代码run的时候屏蔽模拟器 :代码来自我的另外一个仓库Check_Emulator_In_NDK
  • TODO:防止so代码被code inject
char * key = "NMTIzNDU2Nzg5MGFiY2RlZg";//这里是key被做过处理存储在这里的,实际上真实的key是:"1234567890abcdef"

集成

a.先配置local.properties中ndk.dir 要求使用ndk版本必须12b以上.

b.集成到项目中请修改类名方法名,不要暴露加密算法,自行修改key存储到代码里的方案.

c.生成和修改签名.

c.1.生成

//再当前目录下
$ mkdir  keystore
$ cd keystore/
$ keytool -genkey -alias client1 -keypass 123456 -keyalg RSA -keysize 1024 -validity 365 -storetype PKCS12 -keystore ./androidyuan.keystore
输入密钥库口令:weizongwei
再次输入新口令:weizongwei
警告: PKCS12 密钥库不支持其他存储和密钥口令。正在忽略用户指定的-keypass值。
您的名字与姓氏是什么?
  [Unknown]:  weizongwei
您的组织单位名称是什么?
  [Unknown]:  androidyuan.com
您的组织名称是什么?
  [Unknown]:  androidyuan.com
您所在的城市或区域名称是什么?
  [Unknown]:  shanghai
您所在的省/市/自治区名称是什么?
  [Unknown]:  shanghai
该单位的双字母国家/地区代码是什么?
  [Unknown]:  cn
CN=weizongwei, OU=androidyuan.com, O=androidyuan.com, L=shanghai, ST=shanghai, C=cn是否正确?
  [否]:  y

//测试 keystore口令是否正确
$ keytool -exportcert -alias androiddebugkey -keystore   "androidyuan.keystore" | openssl sha1 -binary | openssl base64
  输入密钥库口令:  weizongwei
  8GUZG0hBFvUZ1I4kSq/3vowhE7Y=


c.2.取得当前keystore的hash值,并修改native代码中的包名和hash

目前似乎没有好的办法,我只能用java取,**getSignature(Context context)**打log取出之后,然后写入到C文件中,重新build项目。

集成到自己项目中请先修改keystore hashcode和包名,防止反编译时拿到so文件,进行二次打包使用。

鸣谢

Base64 算法 来自:https://github.com/willemt/pearldb

AES128 算法 来自:https://github.com/kokke/tiny-AES128-C

Native代码混淆器:obfuscation-o-llvm-ndk

注意 : SO会变大的问题

未混淆的so 已混淆的so

对比: 混淆后的so是混淆前的三倍大小。

PS:

因为需要做签名校验,所以无法提供jcenter依赖了,望见谅!!

不管代码安全性多高,我依旧反对key存到代码里。

想要编译出混淆过native代码的so需要修改aesjni/build.gradle文件中的externalNativeBuild,并配置NDK下的Obfuscator-LLVM。

这是我的NDK配置混淆器教程:Obfuscator-LLVM-4.0-BUILD-NDK

其他语言怎么配合加解密?


有问题及时提:new issues

aesjniencrypt's People

Contributors

baoyongzhang avatar brucewind avatar

Watchers

 avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.