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