在项目中要将一个结构加密,加密后的数据都是二进制,而要将这些二进制结果存储到数据库中,等用到时再从数据库中读出,然后根据解密算法,获取结果。希望能对大家有所帮助。
sql server中用到的数据类型是varbinary,可变长的二进制。
delphi中主要用到variant类型
1、写
//根据密文,生成数据库能存储的格式,其中二进制长度为32字节
function fGetVariant(des :PByte):Variant;
var
v :Variant;
b :array[0..31] of Byte;
i :Integer;
begin
v := VarArrayCreate([0,31],varByte);
CopyMemory(@b,des,32);
for i := 0 to 31 do v[i] := b[i];
Result := v;
end;
然后写数据库,和一般写数据库没有区别
//data为varbinary类型
//dparm就是Variant类型的
Parameters.ParamByName('data').Value := dparm;
2、读
//从数据库获取密文,比较简单,主要从数据库获取variant类型,然后再转换为pbyte
function fGetVariartFromDb(sn :string;var inipwd :string):Variant;
var
v :Variant;
uqry :TADOQuery;
begin
Result := 0;
uqry := TADOQuery.Create(nil);
uqry.Connection := dm.con;
with uqry do
begin
Close;
SQL.Clear;
SQL.Add('select dataparm,inipwd from t_usb where usbno = :sn');
Parameters.ParamByName('sn').Value := sn;
Open;
if IsEmpty then
begin
ShowMsg('从数据库获取数据出错!');
Exit;
end;
v := fieldbyname('dataparm').Value;
inipwd := fieldbyname('inipwd').AsString;
if VarIsNull(v) then exit;
end;
uqry.Free;
Result := v;
end;
//从根据数据库密文,获取口令
function fGetPwdFromDb(sn :string):string;
var
v :Variant;
PData :Pointer;
b :PByte;
pwd :string;
begin
Result := '';
v := fGetVariartFromDb(sn,pwd);
PData := VarArrayLock(v);
try
b := PData;
finally
VarArrayUnlock(v);
end;
Result := Decrypt(PChar(pwd),b);
end;