トップへ(mam-mam.net/)

SQLiteで暗号化データベースを使用する ~Delphiソースコード集

検索:

SQLiteで暗号化データベースを使用する ~Delphiソースコード集

DelphiでSQLiteのデータベースファイル暗号化方法、非暗号化データベースファイルを暗号化させる方法、
TFDQueryでパラメータクエリーの使用方法、TFDTableでフィルターの使用方法を解説します。

SQLiteのダウンロードと配置について

https://www.sqlite.org/download.html
から32Bit版「sqlite-dll-win32-x86-3430100.zip(580.14 KiB)」(最新バージョンでOKです)を ダウンロードして解凍し「sqlite3.dll」ファイルを 実行ファイルと同じディレクトリ(通常はプロジェクトディレクトリの「\Win32\Debug」と「\Win32\Release」)に配置しなければなりません。

64Bit版も必要な場合は「sqlite-dll-win64-x64-3430100.zip(1.18 MiB)」(最新バージョンでOKです)を ダウンロードして解凍し「sqlite3.dll」ファイルを 実行ファイルと同じディレクトリ(通常はプロジェクトディレクトリの「\Win64\Debug」と「\Win64\Release」)に配置しなければなりません。

プロジェクトの作成と画面設計

プロジェクトを新規作成(VCLアプリケーション)します。
フォーム(Form1)に以下コンポーネントをドラッグ&ドロップして配置します。

Delphi IDEでSQLiteを使用する画面設計

「すべて保存」を押してプロジェクト保存用の任意のディレクトリを作成してプロジェクトとユニットを保存します。
上述に従って「sqlite3.dll」ファイルを各ディレクトリにコピーします。

非暗号化データベースの作成と接続

まずは普通に非暗号化データベースを作成して接続してテーブルを作成してレコードを挿入して表示するソースコードを記述します。
Button1をダブルクリックしてソースコードを記述します。
(参考:キーボードの「F12」キーを押すと、画面デザインとソースコードの切り替えができます)

unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, FireDAC.Stan.Intf, FireDAC.Stan.Option,
  FireDAC.Stan.Error, FireDAC.UI.Intf, FireDAC.Phys.Intf, FireDAC.Stan.Def,
  FireDAC.Stan.Pool, FireDAC.Stan.Async, FireDAC.Phys, FireDAC.VCLUI.Wait,
  FireDAC.Stan.Param, FireDAC.DatS, FireDAC.DApt.Intf, FireDAC.DApt, Data.DB,
  Vcl.StdCtrls, Vcl.Grids, Vcl.DBGrids, FireDAC.Comp.DataSet,
  FireDAC.Comp.Client, FireDAC.Stan.ExprFuncs, FireDAC.Phys.SQLiteDef,
  FireDAC.Phys.SQLite;

type
  TForm1 = class(TForm)
    FDConnection1: TFDConnection;
    DataSource1: TDataSource;
    DBGrid1: TDBGrid;
    Button1: TButton;
    Button2: TButton;
    FDQuery1: TFDQuery;
    FDPhysSQLiteDriverLink1: TFDPhysSQLiteDriverLink;
    FDSQLiteSecurity1: TFDSQLiteSecurity;
    Button3: TButton;
    FDTable1: TFDTable;
    Button4: TButton;
    Button5: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}


//■データベース「非暗号化.db」が無い場合はデータベースを作成して接続します
//  テキストエディタでUTF-8として「非暗号化.db」ファイルを開くと中身が読めます
procedure TForm1.Button1Click(Sender: TObject);
var ct:Integer;
begin
  if FDConnection1.Connected then FDConnection1.Close;
  //非暗号化データベースの(ファイルが無ければ)作成と接続
  FDConnection1.DriverName:='SQLite';
  FDConnection1.Params.Clear;
  FDConnection1.Params.Add('DataBase=非暗号化.db');
  FDConnection1.Params.Add('LockingMode=Normal');
  FDConnection1.Params.Add('DriverID=SQLite');
  FDConnection1.Open();
  //コンポーネントの接続
  FDTable1.Connection:=FDConnection1;
  DataSource1.DataSet:=FDTable1;
  DBGrid1.DataSource:=DataSource1;
  //テーブル「t_test」の存在確認
  FDQuery1.Open(
    'SELECT COUNT(*) AS ct'+
    '  FROM sqlite_master WHERE tbl_name=''t_test'''
  );
  ct:=FDQuery1.FieldByName('ct').AsInteger;
  FDQuery1.Close;
  //テーブルが無かったらテーブルの作成と行の挿入
  if ct=0 then
  begin
    //テーブルがないのでテーブル作成
    FDQuery1.ExecSQL(
      'CREATE TABLE t_test('+
      '  id INTEGER PRIMARY KEY AUTOINCREMENT,'+
      '  name VARCHAR'+
      ')'
    );
    //3レコード追加
    FDQuery1.ExecSQL(
      'INSERT INTO t_test(name)'+
      '  VALUES'+
      '  (''あいうえおかきくけこ''),'+
      '  (''あいうえおわをん''),'+
      '  (''さしすせそたちつてとなにぬねの'')'
    );
  end;
  //テーブルの表示
  FDTable1.TableName:='t_test';
  FDTable1.Filtered:=False;
  FDTable1.Open();
end;

end.

非暗号化データベースからコピーして暗号化データベースを作成する

非暗号化データベースからコピーしてAES-256暗号化データベースを作成して接続してテーブルを表示するソースコードを記述します。
パスワードは「MyPassword」とします。 Button2をダブルクリックしてソースコードを記述します。
(参考:キーボードの「F12」キーを押すと、画面デザインとソースコードの切り替えができます)

//■データベース「非暗号化.db」を「非暗号化から暗号化.db」に上書きコピーして
//  「非暗号化から暗号化.db」を暗号化して接続します
//  テキストエディタで「非暗号化を暗号化.db」ファイルを開いても暗号化されていて読めません
procedure TForm1.Button2Click(Sender: TObject);
begin
  if not FileExists('非暗号化.db') then
  begin
    ShowMessage(
      '「非暗号化.db」ファイルがありません。'+#13#10+
      'Button1をクリックして「非暗号化.db」を作成してください'
    );
    Exit;
  end;
  //「非暗号化.db」ファイルを「非暗号化を暗号化.db」に上書きコピー
  CopyFile('非暗号化.db','非暗号化を暗号化.db',False);
  //「非暗号化を暗号化する.db」ファイルを暗号化します
  FDSQLiteSecurity1.DriverLink:=FDPhysSQLiteDriverLink1;
  FDSQLiteSecurity1.Database:='非暗号化を暗号化.db';
  FDSQLiteSecurity1.Password:='aes-256:MyPassword';
  FDSQLiteSecurity1.SetPassword;
  //「非暗号化を暗号化する.db」に接続
  if FDConnection1.Connected then FDConnection1.Close;
  FDConnection1.DriverName:='SQLite';
  FDConnection1.Params.Clear;
  FDConnection1.Params.Add('DataBase=非暗号化を暗号化.db');
  FDConnection1.Params.Add('LockingMode=Normal');
  FDConnection1.Params.Add('Encrypt=aes-256');
  FDConnection1.Params.Add('Password=MyPassword');
  FDConnection1.Params.Add('DriverID=SQLite');
  FDConnection1.Open();
  //コンポーネントの接続
  FDTable1.Connection:=FDConnection1;
  DataSource1.DataSet:=FDTable1;
  DBGrid1.DataSource:=DataSource1;
  //テーブルの表示
  FDTable1.TableName:='t_test';
  FDTable1.Filtered:=False;
  FDTable1.Open();
end;

最初から暗号化データベースを作成する

最初からAES-256暗号化データベースを作成するソースコードを記述します。
パスワードは「MyPassword」とします。 Button3をダブルクリックしてソースコードを記述します。
(参考:キーボードの「F12」キーを押すと、画面デザインとソースコードの切り替えができます)

//■暗号化データベース「暗号化.db」が無い場合はデータベースを作成して接続します
//  テキストエディタで「暗号化.db」ファイルを開いても暗号化されていて読めません
procedure TForm1.Button3Click(Sender: TObject);
var ct:Integer;
begin
  if FDConnection1.Connected then FDConnection1.Close;
  //暗号化データベースの(ファイルが無ければ)作成と接続
  FDConnection1.DriverName:='SQLite';
  FDConnection1.Params.Clear;
  FDConnection1.Params.Add('DataBase=暗号化.db');
  FDConnection1.Params.Add('LockingMode=Normal');
  FDConnection1.Params.Add('Encrypt=aes-256');
  FDConnection1.Params.Add('Password=MyPassword');
  FDConnection1.Params.Add('DriverID=SQLite');
  FDConnection1.Open();
  //コンポーネントの接続
  FDTable1.Connection:=FDConnection1;
  DataSource1.DataSet:=FDTable1;
  DBGrid1.DataSource:=DataSource1;
  //テーブル「t_test」の存在確認
  FDQuery1.Open(
    'SELECT COUNT(*) AS ct'+
    '  FROM sqlite_master WHERE tbl_name=''t_test'''
  );
  ct:=FDQuery1.FieldByName('ct').AsInteger;
  FDQuery1.Close;
  //テーブルが無かったらテーブルの作成と行の挿入
  if ct=0 then
  begin
    //テーブルがないのでテーブル作成
    FDQuery1.ExecSQL(
      'CREATE TABLE t_test('+
      '  id INTEGER PRIMARY KEY AUTOINCREMENT,'+
      '  name VARCHAR'+
      ')'
    );
    //5レコード追加
    FDQuery1.ExecSQL(
      'INSERT INTO t_test(name)'+
      '  VALUES'+
      '  (''あいうえおかきくけこ''),'+
      '  (''あいうえおわをん''),'+
      '  (''さしすせそわをん''),'+
      '  (''さしすせそたちつてとなにぬねの''),'+
      '  (''わをん'')'
    );
  end;
  //テーブルの表示
  FDTable1.TableName:='t_test';
  FDTable1.Filtered:=False;
  FDTable1.Open();
end;

パラメータクエリの使用

TFDQueryでパラメータクエリーを使用するソースコードを記述します。
パラメータはSQLで コロンとパラメータ名(:パラメータ名)として使用します。
Button4をダブルクリックしてソースコードを記述します。
(参考:キーボードの「F12」キーを押すと、画面デザインとソースコードの切り替えができます)

//FDQuety1にパラメータクエリーを使用する
procedure TForm1.Button4Click(Sender: TObject);
begin
  if not FDConnection1.Connected then
  begin
    ShowMessage(
      '最初にButton1,Button2,Button3の何れかをクリックして'+#13#10+
      'データベースに接続してください'
    );
    Exit;
  end;
  //コンポーネントの接続
  FDQuery1.Connection:=FDConnection1;
  DataSource1.DataSet:=FDQuery1;
  DBGrid1.DataSource:=DataSource1;
  //パラメータクエリでテーブルの表示
  FDQuery1.SQL.Text:='SELECT * FROM t_test WHERE name like :param_name';
  FDQuery1.Params.ParamByName('param_name').AsString:='%を%';
  FDQuery1.Open();
end;

フィルターの使用

TFDTableでフィルターを使用するソースコードを記述します。
FilterプロパティにSQLでのWHERE句を記述します。
FilteredプロパティをTrueに設定するとフィルターが適用されます。
Button5をダブルクリックしてソースコードを記述します。
(参考:キーボードの「F12」キーを押すと、画面デザインとソースコードの切り替えができます)

//■FDTable1にフィルターを使用する
procedure TForm1.Button5Click(Sender: TObject);
begin
  if not FDConnection1.Connected then
  begin
    ShowMessage(
      '最初にButton1,Button2,Button3の何れかをクリックして'+#13#10+
      'データベースに接続してください'
    );
    Exit;
  end;
  FDTable1.Close;
  FDTable1.Filtered:=False;
  FDQuery1.Close;
  //コンポーネントの接続
  FDTable1.TableName:='t_test';
  FDTable1.Connection:=FDConnection1;
  DataSource1.DataSet:=FDTable1;
  DBGrid1.DataSource:=DataSource1;
  //フィルターを使ってテーブルを表示
  FDTable1.Filter:='name like ''%うえお%'' and id between 1 and 3';
  FDTable1.Filtered:=True;
  FDTable1.Open();
end;