SQLite 原生不支援加密,FireDAC 整合 SQLite Encryption Extension (SEE) 或 wxSQLite3 AES 實現,透過連接參數 Password、NewPassword 實現透明加密:建庫即加密、開啟需密碼、修改密碼無需導出導入,完全零代碼入侵業務邏輯。
const DB_PATH = 'C:\Data\SecureDB.sdb';
procedure TForm1.FormCreate(Sender: TObject);
const SQL_TABLE = 'CREATE TABLE Users(ID INTEGER PRIMARY KEY, Name TEXT, Age INTEGER)';
begin
if FileExists(DB_PATH) then DeleteFile(DB_PATH);
FDConnection1.Params.Add('DriverID=SQLite');
FDConnection1.Params.Add('Database=' + DB_PATH);
FDConnection1.Params.Add('Password=MySecret123'); // 預設 AES-256
// 可指定演算法:Password=aes-128:MySecret, aes-192:..., aes-ctr-256:..., aes-ecb-256:...
FDConnection1.ExecSQL(SQL_TABLE);
FDConnection1.ExecSQL('INSERT INTO Users(Name, Age) VALUES(:n, :a)', ['Alice', 30]);
end;
procedure TForm1.btnOpenClick(Sender: TObject);
begin
FDConnection1.Params.Clear;
FDConnection1.Connected := False;
FDConnection1.Params.Add('DriverID=SQLite');
FDConnection1.Params.Add('Database=' + DB_PATH);
FDConnection1.Params.Add('Password=MySecret123'); // 必須正確
FDConnection1.Connected := True;
FDQuery1.Open('SELECT * FROM Users');
end;
procedure TForm1.btnChangePwdClick(Sender: TObject);
begin
FDConnection1.Params.Clear;
FDConnection1.Connected := False;
FDConnection1.Params.Add('DriverID=SQLite');
FDConnection1.Params.Add('Database=' + DB_PATH);
FDConnection1.Params.Add('Password=MySecret123'); // 舊密碼
FDConnection1.Params.Add('NewPassword=NewSecret456'); // 新密碼,空字串 = 移除加密
FDConnection1.Connected := True; // 觸發重新加密
FDConnection1.Connected := False;
ShowMessage('密碼已變更');
end;
| 參數值 | 演算法 | 備註 |
|---|---|---|
Password=Secret | AES-256 (CBC) | 預設,安全性最高 |
Password=aes-128:Secret | AES-128 | 速度較快 |
Password=aes-192:Secret | AES-192 | 平衡 |
Password=aes-256:Secret | AES-256 | 明確指定 |
Password=aes-ctr-128/192/256:Secret | AES-CTR 模式 | 可並行加密 |
Password=aes-ecb-128/192/256:Secret | AES-ECB 模式 | 不推薦(無 IV) |
TFDSQLiteBackup 目標連接需同樣密碼。FireDAC 將 SQLite 加密降維為兩個連接參數(Password/NewPassword),實現了「零代碼、透明、可變更」的資料級加密,是桌面/嵌入式應用保護敏感資料的最佳選擇。