关于在多层分布结构中对从表加密的处理。(200分)

  • 主题发起人 主题发起人 9164350
  • 开始时间 开始时间
9

9164350

Unregistered / Unconfirmed
GUEST, unregistred user!
当数据从应用程序服务器中提供给客户端时,我希望能在从表中对某一字段数据加密。
应当如何处理呢?主从表已经在应用程序服务器中定义,在从表对应的datasetprovider
中的事件ongetdata中试图处理,但发现数据没有改变,也没有出错。
请高手指点一二,急用。分不够还可再加。
 
有没有人做过啊,给句话嘛。
 
高手哪去了?
 
高手登场!
玩笑,我等水平再高,比之delphi系统程序员也是菜鸟。
数据表加密要根据数据库的类型,一些文件型数据库根本不支持数据表的加密,
我想你应该考虑连接加密和传输加密,如果确实需要对某一字段加密,你可以将
每一数据取出、加密,再存回去。
连接加密和传输加密可以如此:
下面是intercpt.dll动态连接的源代码.(方法datain和dataout功能是拦截数据
对数据进行加密和压缩 ).生成动态连接库以后.不知道如和调用atain和dataout;
还有 DataOut(const Data: IDataBlock);参数data如何设置?
1: regsrv32 /path/intercpt.dll 可以通过在setupfactory中建立安装程序注册intercpt.dll
2: 在scktsrvr.exe中的各个端口中,那个Intercept GUID:GUID加上intercpt.dll的GUID
就是上面程序中的:
const
Class_DataCompressor: TGUID = '{B249776C-E429-11D1-AAA4-00C04FA35CFA}';
//此值可以修改,只要客户端、服务器和intercpt.dll的注册值保持一致。
3:在你的客户端中的SocketConnection的属性中intercpt的值也是这个GUID.
这就行了
scktsrvr中的TServerSocket已经对这个压缩和解压已经封装,只需要对intercpt.dll进行
注册即可。
注意第一个步骤,在客户端中也在进行注册。
在scktsrvr.exe中的扩展TServerSocket中,它是调用TSocketTransport中的FInterceptor: IDataIntercept
而这个FInterceptor是根据用户注册的IDataIntercept接口来创建的。
Datain, Dataout是集成在IDataIntercept接口中的,所以不用单独调用。
而我们所要做的是对IDataintercept接口进行接口的实现(也就是写个类来实现接口的函数
和过程),在scktsrvr中它是自动根据这个GUID调用的。
ServerSocket.InterceptGUID --> SocketTransport.InterceptGUID.
SocketTransport:
if FInterceptGUID <> '' then
Guid := StringToGuid(FInterceptGUID);
//这里将创建一个你注册了的COM对象,也就是你写的对IDataIntercept的实现类
FInterceptor := CreateComObject(Guid) as IDataIntercept;
在数据传输时,
if Assigned(FInterceptor) then
//这里就调用你写的类中的方法
FInterceptor.Datain(Data) //or FInterceptor.DataOut(Data)


下面是数据传输加密部分关键代码,把他写入intercpt.dll,重新编译
procedure Encode(SrcStream: TStream);
var
Buffer : TMemoryStream;
Ch : byte;
begin
if SrcStream.Size=0 then
exit;
// 内部创建临时的缓冲区,结果写回SrcStream, 也可以外部传入DstStream接收结果。
Buffer := TMemoryStream.Create;
try
SrcStream.Position := 0;
// 原来这里用<>判断是一个危险的方式,因为它可能会导致死循环或异常
while SrcStream.Position < SrcStream.Sizedo
begin
SrcStream.Read(Ch,1);
Ch := Ch XOR Ord('a');
Buffer.Write(ch,1);
end;
Buffer.Position := 0;
SrcStream.Size := 0;
SrcStream.CopyFrom(Buffer, 0);
finally
Buffer.Free;
end;
end;

procedure Decode(SrcStream: TStream);
var
Buffer : TMemoryStream;
Ch : byte;
begin
if SrcStream.Size=0 then
exit;
Buffer := TMemoryStream.Create;
try
SrcStream.Position := 0;
while SrcStream.Position < SrcStream.Sizedo
begin
SrcStream.Read(Ch,1);
Ch := Ch XOR Ord('a');
Buffer.Write(ch,1);
end;
Buffer.Position := 0;
SrcStream.Size := 0;
SrcStream.CopyFrom(Buffer, 0);
finally
Buffer.Free;
end;
end;

 
后退
顶部