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)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章