[TOC]
## 兩種思路
### 將內容加密后再寫入數據庫
這種方式使用簡單,在入庫/出庫只需要將字段做對應的加解密操作即可,一定程度上解決了將數據赤裸裸暴露的問題。但也有很大弊端:
1. 這種方式并不是徹底的加密,還是可以通過數據庫查看到表結構等信息。
2. 對于數據庫的數據,數據都是分散的,要對所有數據都進行加解密操作會嚴重影響性能。
### 對數據庫文件加密
SQLCipher
## SQLCipher
使用256-bit AES加密,其原理和SQLiteEncrypt一樣,都是實現了SQLite的加密相關接口
> \- 快速只有5 - 15%的性能開銷加密
> \- 100%的數據庫中的數據文件是加密的
> \- 使用良好的安全模式(CBC模式,密鑰推導)
> \- 零配置和應用程序級加密
> \- OpenSSL加密庫提供算法
### 加密解密過程
SQLite數據庫設計中考慮了安全問題并預留了加密相關的接口。但是并沒有給出實現。SQLite 數據庫源碼中通過使用SQLITE\_HAS\_CODEC宏來控制是否使用數據庫加密。并且預留了四個結構讓用戶自己實現以達到對數據庫進行加密的效果。這四個接口分別是:
* sqlite3\_key(): 指定數據庫使用的密鑰
* sqlite3\_rekey():為數據庫重新設定密鑰;
* sqlite3CodecGetKey():返回數據庫的當前密鑰
* sqlite3CodecAttach(): 將密鑰及頁面編碼函數與數據庫進行關聯。
而sqlcipher就是實現這四個接口以及自己的一些接口
解密的操作是以page為單位進行的(每一個page就是db文件的每1024個字節)。
- Android
- 四大組件
- Activity
- Fragment
- Service
- 序列化
- Handler
- Hander介紹
- MessageQueue詳細
- 啟動流程
- 系統啟動流程
- 應用啟動流程
- Activity啟動流程
- View
- view繪制
- view事件傳遞
- choreographer
- LayoutInflater
- UI渲染概念
- Binder
- Binder原理
- Binder最大數據
- Binder小結
- Android組件
- ListView原理
- RecyclerView原理
- SharePreferences
- AsyncTask
- Sqlite
- SQLCipher加密
- 遷移與修復
- Sqlite內核
- Sqlite優化v2
- sqlite索引
- sqlite之wal
- sqlite之鎖機制
- 網絡
- 基礎
- TCP
- HTTP
- HTTP1.1
- HTTP2.0
- HTTPS
- HTTP3.0
- HTTP進化圖
- HTTP小結
- 實踐
- 網絡優化
- Json
- ProtoBuffer
- 斷點續傳
- 性能
- 卡頓
- 卡頓監控
- ANR
- ANR監控
- 內存
- 內存問題與優化
- 圖片內存優化
- 線下內存監控
- 線上內存監控
- 啟動優化
- 死鎖監控
- 崩潰監控
- 包體積優化
- UI渲染優化
- UI常規優化
- I/O監控
- 電量監控
- 第三方框架
- 網絡框架
- Volley
- Okhttp
- 網絡框架n問
- OkHttp原理N問
- 設計模式
- EventBus
- Rxjava
- 圖片
- ImageWoker
- Gilde的優化
- APT
- 依賴注入
- APT
- ARouter
- ButterKnife
- MMKV
- Jetpack
- 協程
- MVI
- Startup
- DataBinder
- 黑科技
- hook
- 運行期Java-hook技術
- 編譯期hook
- ASM
- Transform增量編譯
- 運行期Native-hook技術
- 熱修復
- 插件化
- AAB
- Shadow
- 虛擬機
- 其他
- UI自動化
- JavaParser
- Android Line
- 編譯
- 疑難雜癥
- Android11滑動異常
- 方案
- 工業化
- 模塊化
- 隱私合規
- 動態化
- 項目管理
- 業務啟動優化
- 業務架構設計
- 性能優化case
- 性能優化-排查思路
- 性能優化-現有方案
- 登錄
- 搜索
- C++
- NDK入門
- 跨平臺
- H5
- Flutter
- Flutter 性能優化
- 數據跨平臺