SQLite开发文档:SQLCipher加密

SQLite是广泛使用的开源嵌入式数据库,具有占用资源低、跨平台、使用简单、支持多程序语言等特点。本文是easeapi.com整理的关于SQLite的第一篇文章,介绍SQLCipher加密相关的内容。

SQLite是广泛使用的开源嵌入式数据库,支持绝大多数SQL语句,支持事务操作。

SQLCipher是开源的SQLite加密扩展组件,官方提供有三个版本:

  • 社区版

免费。支持数据库文件加密,完全开源。

  • 商业版

收费。在社区版本的基础上,支持单项数据(Value Level Encryption)和表级别数据(Encrypted Virtual Tables)的加密,支持性能统计分析,提供主流平台的官方安装包等。由于可以选择性地加密和解密数据,并不是加密整个数据库文件,效率比社区版要快3-4倍(官方数据)。

  • 企业版

收费。在商业版的基础上,支持需求定制。

在大多数情况下,我们选择社区版即可。官方提供了iOS和Android平台的集成文档,参考:

Adding SQLCipher to Xcode Projects
SQLCipher for Android Application Integration

由于我们的项目是跨平台的,需要采用C的实现,而不是高级语言的封装。所以直接源码编译:

git clone https://github.com/sqlcipher/sqlcipher.git
cd sqlcipher
./configure --with-crypto-lib=none
make sqlite3.c

脚本会将src中的代码文件合并成sqlite3.c大文件,我们在项目中使用sqlite3.h,sqlite3.c即可。

SQLite提供了众多的特性,可根据需要开启对应的宏。以iOS平台使用podspec为例,典型的编译参数如下:

s.compiler_flags = '-DSQLITE_THREADSAFE=2 -DSQLITE_HAS_CODEC=1 -DSQLCIPHER_CRYPTO_CC=1 -DSQLITE_TEMP_STORE=2 -DSQLITE_ENABLE_JSON1=1 -DSQLITE_ENABLE_UPDATE_DELETE_LIMIT=1 -DNDEBUG=1'
s.source_files = 'sqlcipher/sqlite3.{h,c}'
  • SQLITE_THREADSAFE=2:多线程安全模式;
  • SQLITE_HAS_CODEC=1:使用加密;
  • SQLCIPHER_CRYPTO_CC:指定加密组件;
  • SQLITE_TEMP_STOR:临时文件存储方式;
  • SQLITE_ENABLE_JSON1:开启JSON扩展;
  • SQLITE_ENABLE_UPDATE_DELETE_LIMIT:支持UPDATE/DELETE使用LIMIT语句。

其中,SQLCIPHER_CRYPTO_CC在不同平台上选择不一样,SQLCipher支持有:

  • SQLCIPHER_CRYPTO_CC:iOS平台,使用CommonCrypto;
  • SQLCIPHER_CRYPTO_LIBTOMCRYPT:使用LibTomCrypt;
  • SQLCIPHER_CRYPTO_NSS:
  • SQLCIPHER_CRYPTO_OPENSSL:使用OpenSSL;

iOS平台直接使用SQLCIPHER_CRYPTO_CC即可。Android平台推荐使用SQLCIPHER_CRYPTO_OPENSSL,此时需要自行编译OpenSSL crypto。当然,以上四种加密组件是目前SQLCipher原生支持的,如果有必要完全可以使用其它加密库,比如mbedTLS(couchbase-lite-libsqlcipher)等。

编译OpenSSL crypto

cd /Users/easeapi/Downloads/
//open ssl
git clone https://github.com/openssl/openssl
https://developer.android.google.cn/ndk/downloads/
/Users/easeapi/Downloads/android-ndk-r21e
export ANDROID_NDK_HOME=/Users/easeapi/Downloads/android-ndk-r21e
export ANDROID_NDK_ROOT=/Users/easeapi/Downloads/android-ndk-r21e
git clone https://github.com/sqlcipher/android-database-sqlcipher
cd android-database-sqlcipher/android-database-sqlcipher/
//build-openssl-libraries.sh,屏蔽rm -rf ${ANDROID_LIB_ROOT}
sh build-openssl-libraries.sh android-16 android-16 /Users/easeapi/Downloads/openssl /Users/easeapi/Downloads/android-ndk-r21e

编译完成后,libcrypto.a将输出到android-ndk-r21e/armeabi-v7a等目录中。

配置完成之后即可使用sqlite3_key接口对SQLite数据库文件设置密码。

其他文章

SQLite开发文档:数据类型、文件锁状态、多线程
SQLite开发文档:PRAGMA配置、性能优化
utf8mb4:MYSQL中使用Emoji
iOS启动优化之二进制重排