導(dǎo)語(yǔ):
SQLite 是一個(gè)輕量級(jí)的顿涣、開(kāi)源的關(guān)系型數(shù)據(jù)庫(kù),是目前移動(dòng)平臺(tái)(如 iOS吱型、Android)數(shù)據(jù)庫(kù)的最佳選擇逸贾。然而免費(fèi)版的 SQLite 是不支持加密的(官網(wǎng)下的默認(rèn)就是免費(fèi)版的) ,這就導(dǎo)致了存儲(chǔ)在 SQLite 中的數(shù)據(jù)很容易被人查看到津滞,不法分子可能會(huì)利用數(shù)據(jù)庫(kù)表結(jié)構(gòu)及內(nèi)容字段分析我們的應(yīng)用,進(jìn)而發(fā)起攻擊灼伤。出于安全的考慮触徐,我們當(dāng)然要對(duì)數(shù)據(jù)庫(kù)文件進(jìn)行加密。
數(shù)據(jù)庫(kù)加密
-
加密方式的選擇
對(duì)數(shù)據(jù)庫(kù)加密主要有兩種方式:將內(nèi)容加密后再存入數(shù)據(jù)庫(kù)中
這種方式使用簡(jiǎn)單狐赡,只需要在入庫(kù)和出庫(kù)時(shí)將字段加解密即可撞鹉,但數(shù)據(jù)庫(kù)的表結(jié)構(gòu)信息依然能被查看到。并且對(duì)內(nèi)容加密后颖侄,搜索查看數(shù)據(jù)庫(kù)中的內(nèi)容都比較麻煩鸟雏。對(duì)數(shù)據(jù)庫(kù)文件直接進(jìn)行加密
這種方式是比較安全的加密方式,目前已知的 SQLite 加密方案基本上都是通過(guò)這種方式實(shí)現(xiàn)的览祖。
加密工具的選擇
目前已知的對(duì) SQLite 加密的工具主要有「SQLite Encryption Extension (SEE)」孝鹊、「SQLiteEncrypt」、「SQLiteCrypt」展蒂、「SQLCipher」又活,但是這里面僅有 SQLCipher 有免費(fèi)版本。
這樣看來(lái)锰悼,開(kāi)源的 SQLCipher 是 SQLite 加密的最佳選擇了柳骄。
簡(jiǎn)單介紹下,SQLCipher 是一個(gè)開(kāi)源的箕般,基于免費(fèi)版 SQLite 的加密數(shù)據(jù)庫(kù)耐薯。它采用 256-bit AES 進(jìn)行加密,主要的接口和 SQLite 相同丝里,另外增加了一些加解密相關(guān)的接口曲初。
數(shù)據(jù)庫(kù)遷移
可能已發(fā)布的 APP 使用的是未加密的 SQLite 版本,因此當(dāng)用戶(hù)覆蓋安裝時(shí)丙者,就需要對(duì)未加密的數(shù)據(jù)庫(kù)進(jìn)行加密复斥。而 SQLCipher 出于效率考慮,它是基于頁(yè)進(jìn)行加密的械媒,因此需要對(duì)原有數(shù)據(jù)庫(kù)中的內(nèi)容進(jìn)行遷移目锭。
根據(jù) SQLCipher 官方文檔评汰, 其本身已經(jīng)提供了對(duì)數(shù)據(jù)庫(kù)遷移的支持,主要就是sqlcipher_export
函數(shù)痢虹。
需要注意的是:
由于檢測(cè)數(shù)據(jù)庫(kù)是否加密比較困難被去,因?yàn)閿?shù)據(jù)庫(kù)尚未打開(kāi),沒(méi)辦法調(diào)用數(shù)據(jù)庫(kù)提供的方法進(jìn)行檢測(cè)(事實(shí)上可以采用檢測(cè) SQLite 數(shù)據(jù)庫(kù)文件的前 100 個(gè)字節(jié)中的信息來(lái)檢測(cè)是否加密)奖唯。因此最好是采用檢測(cè)舊數(shù)據(jù)庫(kù)文件是否存在的方式來(lái)決定是否對(duì)數(shù)據(jù)庫(kù)進(jìn)行遷移惨缆。如果舊數(shù)據(jù)庫(kù)存在則按照遷移流程進(jìn)行,若不存在則按照加密流程進(jìn)行即可丰捷。
密碼安全
數(shù)據(jù)庫(kù)加密及遷移問(wèn)題都解決了坯墨,但是如何保障所用密碼的安全呢?
由于 SQLCipher 在設(shè)計(jì)之初就將密碼的管理與數(shù)據(jù)庫(kù)加密的實(shí)現(xiàn)區(qū)分開(kāi)來(lái)病往,因?yàn)檫@樣能提供更好的靈活性捣染,但同時(shí)也意味著使用者需要負(fù)責(zé)密碼的管理。官網(wǎng) FAQ 中建議如下:1. 密碼內(nèi)容應(yīng)該直接來(lái)自用戶(hù)停巷,且不應(yīng)該存儲(chǔ)在設(shè)備上耍攘。2. 密碼內(nèi)容不應(yīng)該直接硬編碼在程序中。
事實(shí)上畔勤,若要密碼真正的可靠安全蕾各,需要采用類(lèi)似 HTTPS 的一套流程,存在與服務(wù)器的交互且實(shí)現(xiàn)復(fù)雜庆揪。
其實(shí)可以采用簡(jiǎn)單的密碼算法式曲,配合密碼更新機(jī)制來(lái)解決這個(gè)問(wèn)題∪铝颍基本方案如下:
采用「用戶(hù)ID + 固定字符(如 abc123 ) + 加密算法版本號(hào)」進(jìn)行 MD5 生成密碼检访。然后在數(shù)據(jù)庫(kù)文件名包含「用戶(hù)ID」和「加密算法版本號(hào)」,這樣只要拿到數(shù)據(jù)庫(kù)文件就可以算出該數(shù)據(jù)庫(kù)的密碼仔掸,算法相對(duì)簡(jiǎn)單且使用方便脆贵。
為了防止數(shù)據(jù)庫(kù)密碼泄露或者被破解,可以對(duì)數(shù)據(jù)庫(kù)密碼增加更新策略起暮,SQLCipher 本身已經(jīng)提供了更新密碼的接口卖氨。決定是否需要更新密碼可以通過(guò)判斷數(shù)據(jù)庫(kù)名稱(chēng)中的「加密算法版本號(hào)」實(shí)現(xiàn)。若「加密算法版本號(hào)」與當(dāng)前 APP 中內(nèi)置的不一致负懦,則執(zhí)行新的密碼生成算法(如替換固定字符為 xyz888 等)筒捺,隨后再調(diào)用 SQLCipher 更新密碼的接口即可。
參考:
(完)