SQLite 提供encryption extensions,其中有 sqlite3-see-cccrypt.c:
此文件是公共域“sqlite3.c”文件的直接替换,增加了对 AES-128 和 AES-256 加密算法的支持,在 OFB 模式下,使用外部 CCCrypt 加密。 CCCrypt 是 MacOS 和 iOS 上的默认加密库,因此建议在这些平台上使用这种 SEE 实现。
see-ccrypt.c 模块通常只进行 AES128 加密。但是,当使用 -DCCCRYPT256 编译 see-cccrypt 时,当且仅当密钥长度正好为 32 字节时,它将使用 AES256。
我不知道这是否是 Apple 使用的。
当您使用abc123 键创建数据库时,会发生以下情况:
* frame #0: 0x00007fff52a041fb libcommonCrypto.dylib`CCCrypt
frame #1: 0x00007fff21cfca21 libsqlite3.dylib`sqliteCodecCCCrypto + 305
frame #2: 0x00007fff21bc76d3 libsqlite3.dylib`pager_write_pagelist + 243
...
CCCrypt 被使用。页大小为 4096 字节。 CCrypt函数签名是:
CCCryptorStatus
CCCrypt(CCOperation op, CCAlgorithm alg, CCOptions options, const void *key, size_t keyLength,
const void *iv, const void *dataIn, size_t dataInLength, void *dataOut, size_t dataOutAvailable,
size_t *dataOutMoved)
这个函数被调用:
-
op 设置为 0(加密)
-
alg 设置为 0 (AES 128),
-
key 是 abc123abc123abc1(初始密钥,复制到适合 16 个字节),
-
dataIn 是一个我还不认识的垃圾(不是普通的 SQLite 页面),
-
dataInLength 是 4096,
-
dataOutMoved 返回时设置为 4096。
还有iv的值是:
0x01 0x00 0x00 0x00 0xc0 0xa2 0xe8 0xa8
0x44 0x49 0xef 0xa0 0xa4 0x7b 0xec 0x5f
我不知道 SQLite 的内部结构,但看起来前四个字节代表页码,其余的是一些 随机的东西。 CCCrypt 被每个页面调用,后续页面 iv 以 0x02 0x00 0x00 0x00、0x03 0x00 0x00 0x00 等开头。
当你查看加密的 sqlite 文件时,iv 的最后 12 个字节存储在每页的末尾:
% hexdump -C db-enc.sqlite| grep "44 49 ef"
00000ff0 e2 a1 77 2a c0 a2 e8 a8 44 49 ef a0 a4 7b ec 5f
^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|- ? |- last 12 bytes of iv
-
0xff0 = 4080
-
4080 + 16 = 4096(= 页面大小)
有人会说使用了 AES 128,但是......当我打开已经存在的数据库时,再次调用 CCCrypt,但操作设置为 0(加密)。换句话说,CCCrypt 永远不会被解密操作调用。
库存储:
/Applications/Xcode-beta.app/Contents/Developer/Platforms/
iPhoneOS.platform/Library/Developer/CoreSimulator/
Profiles/Runtimes/iOS.simruntime/Contents/Resources/
RuntimeRoot/usr/lib/libsqlite3.dylib
要关注的符号:
-
_sqlite3CodecAttach
_sqliteCodecCCCrypto
_sqliteCodecCCCryptoSizeChng
_sqliteCodecCCCryptoFree
_loadKeyCCCrypt
相关外部符号:
_CCCrypt:
00000000001ce000 extern function code ; in /usr/lib/libSystem.B.dylib, CODE XREF=imp___stubs__CCCrypt, DATA XREF=_CCCrypt_ptr
_CC_SHA256_Final:
00000000001ce008 extern function code ; in /usr/lib/libSystem.B.dylib, CODE XREF=imp___stubs__CC_SHA256_Final, DATA XREF=_CC_SHA256_Final_ptr
_CC_SHA256_Init:
00000000001ce010 extern function code ; in /usr/lib/libSystem.B.dylib, CODE XREF=imp___stubs__CC_SHA256_Init, DATA XREF=_CC_SHA256_Init_ptr
_CC_SHA256_Update:
00000000001ce018 extern function code
dlopen 来电:
- 为压缩流打开
/usr/lib/libcompression.dylib
这就是我目前所发现的。如果有人想继续,请随意,我没有更多时间玩这个兔子洞了:)