FireDACによるSQLiteデータベースの暗号化
概要
FireDACでは、SQLiteデータベースを暗号化する機能がサポートされています。XE5以前のバージョンのFireDACでも、この機能は利用できますが、今回紹介する記事は、XE5のFireDACを対象といたします。
FireDACで利用可能な暗号化モードの種類は、以下の通りです。
|
FireDACでは、暗号化モードのデフォルトは、「aes-256」です。
暗号化するための前準備
FireDACでSQLiteデータベースの暗号化を管理するためには、TFDSQLiteSecurityコンポーネントを利用します。
このコンポーネントを利用すると、データベースの暗号化、データベースの復号化、暗号化されたデータベースのパスワードの変更といった操作が行えます。TFDSQLiteSecurityコンポーネントは、ツールパレットの[FireDAC Services]というカテゴリに配置されています。
図1: TFDSQLiteSecurityコンポーネントの配置とDriverLinkの設定
図1のようにTFDSQLiteSecurityコンポーネントをフォームやデータモジュールへ配置し、オブジェクトインスペクタで、TFDSQLiteSecuritのDriverLinkプロパティにSQLiteのデータベースドライバ(TFDPhysSQliteDriverLink)を設定してください。
データベースを暗号化する
FireDACでSQLiteデータベースを暗号化するには、以下のようにコーディングします。
Delphiの場合:
FDSQLiteSecurity1.Database := '...';
FDSQLiteSecurity1.Password := '<暗号化モード>:<パスワード>';
FDSQLiteSecurity1.SetPassword;
C++Builderの場合:
FDSQLiteSecurity1->Database = "...";
FDSQLiteSecurity1->Password = "<暗号化モード>:<パスワード>";
FDSQLiteSecurity1->SetPassword();
但し、Passwordプロパティに指定するパスワードは、暗号化モードとパスワードを:(コロン)で連結した組み合わせの文字列を設定する必要があります。
例えば、
-SQLiteデータベースファイルの絶対パスが "C:\Users\Public\Documents\Sample.db"
-暗号化モードが "aes-128"
-パスワードが "12345"
の場合は、以下のように記述します。
Delphiの場合:
FDSQLiteSecurity1.Database := 'C:\Sample.db';
FDSQLiteSecurity1.Password := 'aes-128:12345';
FDSQLiteSecurity1.SetPassword;
C++Builderの場合:
FDSQLiteSecurity1->Database = "C:\\Users\\Public\\Documents\\Sample.db";
FDSQLiteSecurity1->Password = "aes-128:12345";
FDSQLiteSecurity1->SetPassword();
データベースを復号する
暗号化されたSQLiteデータベースをFireDACで復号化するには、以下のようにコーディングします。
Delphiの場合:
FDSQLiteSecurity1.Database := '...';
FDSQLiteSecurity1.Password := '<暗号化モード>:<パスワード>';
FDSQLiteSecurity1.RemovePassword;
C++Builderの場合:
FDSQLiteSecurity1->Database = "...";
FDSQLiteSecurity1->Password = "<暗号化モード>:<パスワード>";
FDSQLiteSecurity1->RemovePassword();
なお、Passwordプロパティに設定するパスワードは、データベースの暗号化と同じく暗号化モードとパスワードを:(コロン)で連結した組み合わせの文字列になります。そして、復号化で設定するパスワードは、必ずデータベースを暗号化する際に指定したパスワードを入力してください。
暗号化したデータベースへ接続する
FireDACで暗号化されたSQLiteデータベースへアクセスするには、TFDConnectionのParamsプロパティの接続パラメータである”Password”と”Encrypt”にデータベースを暗号化する際に設定したパスワードと暗号化モードを指定します。
例えば、暗号化モードが”aes-128”、パスワードが”12345”でSQLiteデータベースを暗号化した場合は、以下のようにコーディングします。
Delphiの場合:
FDConnetcion1.Params.Add := 'Encrypt=aes-128';
FDConnetcion1.Params.Add := 'Password=12345';
C++Builderの場合:
FDConnetcion1->Params->Add = "Encrypt=aes-128";
FDConnetcion1->Params->Add = "Password=12345";
またTFDConnetionの接続エディタで設定する場合は、以下の図の通りです。
図2: FireDAC 接続エディタ
エラーメッセージ
FireDACで暗号化されたSQLiteデータベースへ接続すると、様々なエラーが発生することがあります。そのエラーメッセージの例をいくつか紹介いたします。
- [FireDAC][Phys][SQLite] ERROR: Cipher: DB is not encrypted
暗号化されていないデータベースに対して、復号化しようとすると発生します。
- [FireDAC][Phys][SQLite] ERROR: file is encrypted or is not a database
既に暗号化されている、あるいは暗号化モードが異なるパスワードを指定すると発生します。
- [FireDAC][Phys][SQLite] ERROR: Cipher: Invalid password is specified or DB is corrupted
データベースの復号時や暗号化されたデータベースへの接続時に、指定するパスワードが間違っていると発生します。