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.
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
如果要启用日志打印功能,需要修改两个地方
1.
Android.mk
LOCAL_CFLAGS += $(SQLCIPHER_CFLAGS) -DLOG_NDEBUG
如果要启用日志打印,就去掉 -DLOG_NDEBUG
2.
sqlite3.c
添加#define CODEC_DEBUG 113
调试完成后恢复就OK了.
原始的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)