Sqlcipher-android添加国密算法的支持

Sqlcipher-android添加国密算法的支持

Sqlcipher默认使用的Openssl加密库的AES256的加密算法,由于项目需求需要替换成国密算法.

Sqlcipher支持三种加密库:
- Openssl库
- LibTomCrypt库
- crypto++库

1.OpenSSL :C语言实现,支持跨平台。代码量比较庞大,经过很多次调整,目前的结构不再清晰明了,要代码剥离的话非常痛苦,使用起来不是很方便。
2. Crypto++:C++语言实现,代码庞大且复杂,使用起来不方便。支持跨平台。
3. LibTomCrypt:短小精干,结构清晰明了,速度中等。适合初学密码学的学生和期望对密码学有进一步了解的人士。名气和使用广泛性不如OpenSSL和Crypto++。

sqlite3.c:

#if !defined (SQLCIPHER_CRYPTO_CC) \
   && !defined (SQLCIPHER_CRYPTO_LIBTOMCRYPT) \
   && !defined (SQLCIPHER_CRYPTO_OPENSSL)
#define SQLCIPHER_CRYPTO_OPENSSL

默认是选择openssl加密库,如果要选择Crypto++或者LibTomCrypt库,在Android.mk中添加

LOCAL_CFLAGS +=  -DSQLCIPHER_CRYPTO_LIBTOMCRYPT

或者

LOCAL_CFLAGS +=  -DSQLCIPHER_CRYPTO_CC

在这里我还是选择OpenSSL,因为openssl最新版本已经添加了国密算法.OpenSSL版本选择OpenSSL_1_1_1-pre1.

环境

  • Android-database-sqlcipher 3.5.9
  • OpenSSL_1_1_1-pre1
  • sqlcipher 3.20.1
  • NDK
  • jdk
  • Git
  • Android SDK
  • Ubuntu

环境变量

sudo gedit ~/.bashrc 
export ANDROID_NDK_ROOT=~/Android/ndk-bundle
export ANDROID_NDK=~Android/ndk-bundle
export GCC=~/Android/ndk-bundle/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin
export ANDROID_HOME=~/Android/
export JAVA_HOME=~/jdk1.8.0_171   (以上配置具体路径修改为自己的相应的路径)
source ~/.bashrc  注意:以上不要在su命令下配置,以及之后的所有操作都不要在su命令下

下载源码

git clone https://github.com/sqlcipher/android-database-sqlcipher.git
git submodule update --init  网络比较慢,要等很久,没有进度,只能一直等,是下载sqlcipher源码和openssl1.1.0g

下载openssl1.1.1-pre1,然后替换android-database-sqlcipher/android-database-sqlcipher/src/main/external/openssl

启用openssl和sqlcipher日志打印功能

如果要启用日志打印功能,需要修改两个地方
1.

Android.mk
LOCAL_CFLAGS +=  $(SQLCIPHER_CFLAGS)  -DLOG_NDEBUG
如果要启用日志打印,就去掉 -DLOG_NDEBUG

2.

sqlite3.c
添加#define CODEC_DEBUG 113

调试完成后恢复就OK了.

sqlcipher替换加密算法

原始的sqlite3.c
#ifndef CIPHER
#define CIPHER "aes-256-cbc"
#endif
修改后的sqlite3.c
#ifndef CIPHER
#define CIPHER "sm4-cbc"
#endif

参数配置

android-database-sqlcipher/build.gradle

配置最低支持Android版本和最低支持Android64位版本
minimumAndroidSdkVersion = 14
minimumAndroid64BitSdkVersion = 21
targetAndroidSdkVersion = 24

过滤,提高编译速度

如果不需要编译64位的库,可以在native.gradle文件注释掉
executeNdkBuild(
  "${nativeRootOutputDir}/libs64",
  file("src/main/cpp").absolutePath,
  file("src/main/cpp/Application64.mk").absolutePath,
  "${sqlcipherCFlags}")

编译openssl静态库时如果有些架构的不需要,可以在build-openssl-libraries.sh
for SQLCIPHER_TARGET_PLATFORM in armeabi armeabi-v7a x86 x86_64 arm64-v8a
中删除不需要的架构

Application32.mk和Application64.mk中
APP_ABI := armeabi armeabi-v7a x86 中删除不需要的架构

源码编译

在项目根目录输入 make build

编译好的库(armeabi,armeabi-v7a,x86)

你可能感兴趣的:(开源项目分析,sqlcipher,国密,sm4)