SQLite实现加密

来源:互联网 发布:sql r2是什么 编辑:程序博客网 时间:2024/06/01 11:45

SQLite3 4 Delphi:Delphi中操作SQLite库。项目主页:http://code.google.com/p/sv-utils/最新库下载:http://sv-utils.googlecode.com/files/SQLite3_4_Delphi_RC2.zip

wxsqlite:这是wxWidgets组件之一,我们用它来实现加密。下载地址: http://jaist.dl.sourceforge.net/project/wxcode/Components/wxSQLite3/wxsqlite3-3.0.3.zip


下载完上述两个文件后,分别取两个文件中的部分文件:

1,SQLite3 4 Delphi:取“SQLite\sv-utils\SQLite3\Source”目录下3个文件:“SQLite3.pas”、“SQLiteTable3.pas”、“sv.inc”,放到工程里,并     把SQLite3.pas”、“SQLiteTable3.pas”这两个文件添加到工程里,在使用地方引入这两个单元。

2,wxsqlite:取“wxsqlite3-3.0.3\sqlite3\secure\aes128\dll\release”下的“sqlite3.dll”,放到程序运行目录中。


上面文件准备完毕后,就已经完成对数据库加密需要的全部文件了。


演示代码:

unit Unit1;interfaceuses  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,  System.Classes, Vcl.Graphics,  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;type  TForm2 = class(TForm)    logMemo: TMemo;    clearLogBtn: TButton;    Button2: TButton;    dbNameEdt: TEdit;    Label1: TLabel;    passwordEdt: TEdit;    Label2: TLabel;    createTableBtn: TButton;    insertDataBtn: TButton;    deleteDataBtn: TButton;    selectDataBtn: TButton;    procedure clearLogBtnClick(Sender: TObject);    procedure Button2Click(Sender: TObject);    procedure createTableBtnClick(Sender: TObject);    procedure insertDataBtnClick(Sender: TObject);    procedure selectDataBtnClick(Sender: TObject);    procedure deleteDataBtnClick(Sender: TObject);  private    { Private declarations }  public    { Public declarations }    procedure MyLog(tempLog: string); // log方法  end;var  Form2: TForm2;  logInfo: string; // log信息implementation{$R *.dfm}uses SQLite3, SQLiteTable3;procedure TForm2.Button2Click(Sender: TObject);var  sldb: TSQLiteDatabase;  sltb: TSQLiteTable;  sSQL: String;  dbName: string; // 数据库名  password: string; // 密码begin  dbName := trim(dbNameEdt.Text);  password := trim(passwordEdt.Text);  try    sltb := nil;    sldb := TSQLiteDatabase.Create(dbName, seUTF8, password);    sldb.ChangePassword(password);    MyLog('加密数据库创建完毕:数据库 = ' + dbName + ' ; 密码 = ' + password);  finally    sldb.Free;    if sltb <> nil then    begin      sltb.Free;    end;  end;end;procedure TForm2.clearLogBtnClick(Sender: TObject);begin  logMemo.Clear;end;// 创建表procedure TForm2.createTableBtnClick(Sender: TObject);var  sldb: TSQLiteDatabase;  sltb: TSQLiteTable;  sSQL: String;  dbName: string; // 数据库名  password: string; // 密码begin  dbName := trim(dbNameEdt.Text);  password := trim(passwordEdt.Text);  try    sltb := nil;    sldb := TSQLiteDatabase.Create(dbName, seUTF8, password);    sldb.ChangePassword(password);    sSQL := 'CREATE TABLE IF NOT EXISTS [test] (';    sSQL := sSQL + '[a] VARCHAR(100)  NULL,';    sSQL := sSQL + '[b] VARCHAR(100)  NULL';    sSQL := sSQL + ')';    sldb.ExecSQL(sSQL);    MyLog('创建表: test');  finally    sldb.Free;    if sltb <> nil then    begin      sltb.Free;    end;  end;end;procedure TForm2.deleteDataBtnClick(Sender: TObject);var  sldb: TSQLiteDatabase;  sltb: TSQLiteTable;  sSQL: String;  dbName: string; // 数据库名  password: string; // 密码begin  dbName := trim(dbNameEdt.Text);  password := trim(passwordEdt.Text);  try    sltb := nil;    sldb := TSQLiteDatabase.Create(dbName, seUTF8, password);    sldb.ChangePassword(password);    sSQL := 'DELETE FROM [test] ';    sldb.ExecSQL(sSQL);    MyLog('删除数据完毕 ');  finally    sldb.Free;    if sltb <> nil then    begin      sltb.Free;    end;  end;end;// 添加数据procedure TForm2.insertDataBtnClick(Sender: TObject);var  sldb: TSQLiteDatabase;  sltb: TSQLiteTable;  sSQL: String;  dbName: string; // 数据库名  password: string; // 密码  i: integer;  maxCount: integer; // 添加数据最大数量begin  dbName := trim(dbNameEdt.Text);  password := trim(passwordEdt.Text);  try    sltb := nil;    sldb := TSQLiteDatabase.Create(dbName, seUTF8, password);    sldb.ChangePassword(password);    maxCount := 9;    for i := 0 to maxCount do    begin      sSQL := 'INSERT INTO [test] VALUES (';      sSQL := sSQL + QuotedStr('a' + inttostr(i)) + ',';      sSQL := sSQL + QuotedStr('b' + inttostr(i));      sSQL := sSQL + ')';      sldb.ExecSQL(sSQL);    end;    MyLog('共添加: ' + inttostr(maxCount + 1) + ' 条数据');  finally    sldb.Free;    if sltb <> nil then    begin      sltb.Free;    end;  end;end;// log方法procedure TForm2.MyLog(tempLog: string);var  temp: string;  oldLog: string;begin  if trim(tempLog) <> '' then  begin    oldLog := trim(logMemo.Text);    logMemo.Clear;    temp := FormatDateTime('yyyy-mm-dd hh:mm:ss', now) + ' ' + trim(tempLog);    if oldLog = '' then    begin      logMemo.Lines.Add(temp);      logMemo.Lines.Add('');    end    else    begin      logMemo.Lines.Add(temp);      logMemo.Lines.Add('');      logMemo.Lines.Add(oldLog);    end;  end;end;procedure TForm2.selectDataBtnClick(Sender: TObject);var  sldb: TSQLiteDatabase;  sltb: TSQLiteTable;  sSQL: String;  dbName: string; // 数据库名  password: string; // 密码  totalCount: integer;  temp: string;begin  dbName := trim(dbNameEdt.Text);  password := trim(passwordEdt.Text);  try    sltb := nil;    sldb := TSQLiteDatabase.Create(dbName, seUTF8, password);    sldb.ChangePassword(password);    sSQL := 'SELECT * FROM [test] ';    sltb := sldb.GetTable(sSQL);    // 1,显示总数据条数    totalCount := 0;    if not sltb.EOF then    begin      totalCount := sltb.Count;    end;    MyLog('共: ' + inttostr(totalCount) + ' 条数据');    // 2,显示详细信息    temp := '';    while not sltb.EOF do    begin      if temp = '' then      begin        temp := #13#10 + sltb.FieldValByNameAsString['a'] + ' ; ' +          sltb.FieldValByNameAsString['b'] + #13#10;      end      else      begin        temp := temp + sltb.FieldValByNameAsString['a'] + ' ; ' +          sltb.FieldValByNameAsString['b'] + #13#10;      end;      sltb.Next;    end;    if temp <> '' then    begin      MyLog('详细数据:' + #13#10 + temp);    end;  finally    sldb.Free;    if sltb <> nil then    begin      sltb.Free;    end;  end;end;end.



原创粉丝点击