Delphi编写网络程序的安全措施

一、 原理

目前进行数据加密的方法很多,对数据的保护起到一定的作用。但如果采用固定的密钥或是密钥随数据一起传送,则均不能达到令人满意的保密效果。在实践过程中,我摸索出了一套“请求-应答”模式的随机密钥方法,对密码和数据的保密效果都令人十分满意。

当客户端程序启动并企图与服务器程序建立连接时,客户程序从服务器端取得一个由服务器程序产生的随机字串,系统将以此字串为密钥来传送用户登录密码和数据。由于密钥由服务器程序随机产生,客户每次登录时密钥均不相同,因此大大减少了密码被拦截导致数据被窃的可能性。

服务器端可以在远程数据模块中引出一个自定义接口,该接口返回一个随机字串。远程数据模块要记录该字串作为后续处理的密钥。随机字串的产生法可以多种多样,最简单的方法是用Random()函数产生一个随机数后再由此数用Format()函数或IntToStr()产生一个字符串。

二、 用户登录措施

为了防止程序被非法调试从而泄露密码,必须将客户的登录信息在服务器端处理,也可以专门增加一个安全层负责客户的登录。客户的登录信息储存在客户资料表中,包括用户名、密码、权限等信息。

客户程序登录时,先调用服务器程序的接口获得密钥字串,并用此密钥对用户输入的用户名和密码进行加密并向服务器发送登录信息。加密算法可以是DES算法或其它有效算法。服务器接到登录信息后,先用先前产生并记录的随机密钥对登录信息进行解密,再将解密后的信息与存储的客户资料表中的信息进行对照,从而判断客户信息是否合法以及该客户享有的数据权限等。

该过程的客户端程序如下:

  strKey:=myRemoteSever.GetKey();
   {调用服务器的接口获得随机密钥}
   UserName:=Ency(strUserName,strKey);
   {对用户名加密,Ency()为加密算法}
   Password:=Ency(strPassword,strKey);
   {对登录密码进行加密}
   If myRemoteServer.LogIn(UserName,Password) then {登录}
   Begin
   {进行处理}
   End;
   服务器端的登录过程LogIn()如下:
   strUserName:=DeEncy(UserName,strKey);
   {对用户名解密,DeEncy()为解密算法}
   strPassword:=DeEncy(Password,strKey);
   {对登录密码解密}
   {查询数据库}
   if (Pass) then
   Result:=true
   Else
   Result:=false;

要注意的是,在服务器程序和客户程序中,StrKey均应定义为全程变量。

为了防止客户资料表被程序外打开从而泄露密码,可以对客户资料进行一定的加密措施,例如PARADOX表可以添加Password,服务器程序在访问客户资料表时先提供该Password。

三、 数据传送

在网络程序中,一些敏感数据在网上传送时必须加密。Delphi的MIDAS机制提供了数据加密的途径,可以在数据传往客户端之前对一些字段进行加密,也可以在接收到客户端的更新数据请求后对来自客户端的数据的相应字段进行解密后才向数据库进行更新。为了达到些目的,可以在服务器程序的远程数据模块中加入一个Tprovider或是TdataSetProvider对象,并将此对象的DataSet属性置为要处理的数据集。在Tprovider的OnGetData事件中加入如下代码:

   with DataSet do
  begin
   while not EOF do
   begin
   Edit;
   SensitiveData.AsString :=
   Ency(SensitiveData.AsString,strKey);
   {对敏感数据加密}
   Post;
   Next;
   end;
   end;

以上代码可以将敏感数据加密后再送往客户程序。

同样,在Tprovider的OnUpdateData事件中加入一些处理代码便可对客户端送来的数据进行解密。

以上只是介绍了网络程序安全措施实现的一般原理,在此基础上,可以增加其它保密措施,以达到更好的保密效果。例如,客户程序可以用特定的辅助硬件设备来增加安全性。在智能卡应用程序中,客户程序在登录时不仅要求用户输入用户名和密码,程序同时检查IC读写器中IC卡的类型及特定的内容,这样,既使密码泄露了不会被人冒名登录。当然,任何安全措施都不是绝对安全的,安全措施还要有严格的保密制度及使用人员的高度的保密意识才能真正起到保密作用。

时间: 2024-10-02 02:34:30

Delphi编写网络程序的安全措施的相关文章

断点-关于delphi编写的程序在某些操作系统上运行出错的问题

问题描述 关于delphi编写的程序在某些操作系统上运行出错的问题 大家好 本人从事程序测试工作3年左右 还属于菜鸟级别 目前遇到了一个比较棘手的问题 希望高手可以指点 关于delphi编写的程序在某些操作系统上运行出错的问题:同样的程序在xp系统可以正常运行 在win7某些系统可以 某些系统不行(即使是win7旗舰版32位正常安装的已经打上sp1补丁的系统) 所加的断点不起作用 不能够显示 直接抛系统错误(外部组件异常之类的) 希望精通delphi程序以及操作系统的高手可以指点下 如果可以远程

用Delphi编写安装程序

当你完成一个应用软件的开发后,那么你还需要为该软件做一个规范化的安装程序,这是程序设计的最后一步,同时也是很重要的一步,因为运行安装程序往往是用户做的第一步操作. 很多报刊文章介绍了许多如何利用installshield等工具软件来制作安装程序的方法,这种办法可以很快建立起较常见的安装模式,但用这种办法也有一些不足,如做成的安装程序一般较大:风格较单一:不能灵活的控制启动方式和快捷方式.其实安装程序的的几个运行步骤较固定,我们完全可以自己来编写安装程序.下面就详细介绍如何用DELPHI编写具有自

C#中使用WMI编写网络程序

WMI是Windows Management Instrumentation的简称,即:视窗管理规范.在 Windows 2000或以后的版本中均安装得有,NT4.0则需要安装WMI的核心组件.通 过WMI可以获取远程计算机的各种数据信息,控制远程计算机的各种行为,而这就 像操作本地机一样方便.简单. 一.WMI简介 WMI从根本上说应该为一种服务,并且对于本地不同的用户,WMI所有的权限也 不一样.计算机超级用户可以为计算机中的每一个用户,设定不同的WMI权限.在 默认状态下,超级用户拥有WM

用Delphi编写数据报存储控件

一.概述 在用Delphi编写数据库程序时,经常涉及到数据的导入和导出操作,如:将大型数据库中的数据存储为便携文件,以便于出外阅读:将存储在文件中的数据信息,导入到另外的数据库中:而且,通过将数据库中的数据存储为数据文件,更便于程序内部和程序间交换数据,避免通过内存交换数据的烦琐步骤,例如在笔者编写的通用报表程序中即以该控件作为数据信息传递的载体. 二.基本思路 作为数据报存储控件,应能够存储和读入数据集的基本信息(如:字段名,字段的显示名称,字段的数据类型,记录数,字段数,指定记录指定字段的当

《Windows网络与通信程序设计(第3版)》——1.3 网络程序寻址方式

1.3 网络程序寻址方式 编写网络程序,必须要有一种机制来标识通信的双方.本节详细讨论Internet中各层的寻址方式,以及相关的寻址协议. 1.3.1 MAC地址网络通信的最边缘便是LAN了,我们先来看看在LAN中是如何寻址的. 1.MAC子层和MAC地址LAN主要使用广播通信.在其内部,许多主机连在相同的通信通道上,通信时的关键问题是当竞争存在时如何决定谁使用通道.解决此问题的协议属于链路层的子层,称为MAC(Medium Access Control,介质访问控制)子层.MAC子层在LAN

c#-用C#编写网络画图程序 程序代码也可以 谢谢!

问题描述 用C#编写网络画图程序 程序代码也可以 谢谢! 设计要求:(1)采用C/S模式,每个用户拥有一个帐号和密码,成功登录后在客户端上实现画图,画图文件由用户选择保存在服务器或者客户端.(2)用户可以查看服务器及客户端上文件夹里的画图文件.(3)服务器可以同时服务多个画图用户.(4)画图程序具备以下功能:①绘制直线.椭圆.圆弧.矩形.多边形及草稿线.②设置绘制图形的颜色及线条粗细.③能够对封闭图形进行填充.④读入及保存绘制图形. 解决方案 http://www.cnblogs.com/stg

python3编写C/S网络程序实例教程_python

本文以实例形式讲述了python3编写C/S网络程序的实现方法.具体方法如下: 本文所述实例是根据wingIDE的提示编写的一个C/S小程序,具体代码如下: client端myclient.py代码如下: #!/bin/env python #-*- coding:gb18030 -*- # import socket import time i=1 while i<10: address=("127.0.0.1",3138) s=socket.socket(socket.AF_

Visual C# 2005中编写Socket网络程序

在网络环境下,我们最感兴趣的两个命名空间是System.Net和System.Net.Sockets.System.Net命名空间通常与较高程的操作有关,例如download或upload,试用HTTP和其他协议进行Web请求等等,而System.Net.Sockets命名空间所包含的类通常与较低程的操作有关.如果要直接使用Sockets或者TCP/IP之类的协议,这个命名空间的类是非常有用的. 在.Net中,System.Net.Sockets 命名空间为需要严密控制网络访问的开发人员提供了

编写小型网络程序发布本地html文件小问题

问题描述 importjava.net.*;importjava.io.*;publicclassServer{publicstaticvoidmain(String[]args)throwsException{ServerSocketserver=newServerSocket(9999);Socketsock=server.accept();FileInputStreamin=newFileInputStream("g:\issue\1.html");OutputStreamout