width="84%">为应用程序添加口令
北京燕山石化计算中心软件开发部
吕彤
----不知您是否曾为数据被人盗用而苦恼;不知您是否因软件没有一套严密的安全防护系统而不敢放心使用;不知您是否曾经费尽心机作过数据加密但是对加密效果大不满意?如果您曾有过诸如此类的困惑的话,Delphi为您提供了一个简单而出色的解决办法。
----这似乎是在吹嘘Delphi的功能,但Delphi的所有版本无一例外地提供了对其Paradox数据库的口令设置,设置过口令的Paradox数据库的数据也被加密而无法用其它工具查看。这一特性使得我们用Delphi提高应用程序的安全性变得简单易行。不过要说明的是:本方法所论的加密并非万无一失,因为电脑黑客们无所不在,他们可以轻易地打破你的任何加密方法,但就一般人而言本文所论的加密方法就足够了。
----一、首先,一套软件的安全性包括对数据访问的限制。未授权的用户不能访问其中的某些数据或者根本不能进入应用程序。据此可以设计一个数据表,用来存储用户的级别、用户的登录名称以及用户密码,不妨将此表命名为PARA.DB。PARA.DB的结构如下:
字段名字段类型字段长度注释
OwnerA20应用程序名
UserA10用户名
UserLevelA10用户级别
PasswordIDA10登录口令
----考虑到您开发的应用程序可能不止一个,所以Owner字段用来识别PARA.DB所属的应用程序以防止一个PARA.DB能适用于所有应用程序;后三个字段用来给用户设置使用权限。所有的字段都十分重要,但是如果您的应用程序是单用户的、只需要一个简单的口令的话则可以省略User、Userlevel甚至Owner字
段而只留一个登录口令字段PasswordID。
----二、然后,我们需要两个函数:
----1、GetPassword-读取用户的输入,并判断口令的正确性和用户的级别。
function GetPassword : Boolean;
{根据返回值来判断是否输入了正确口令}
var
PasswordForm: TPasswordForm;{口令登录屏幕}
begin
Result := False;
PasswordForm := TPasswordForm.Create(Self);
if Passwordform.TablePara.fields[0].asstring = '' then
{如果没有任何口令则不启动口令登录屏幕}
begin
Result := True;
PasswordForm.Free;
end
else
try
with PasswordForm do
begin
if ShowModal = mrOK then
if EditInputPass.Text < > TablePara.Fields .AsString then
Application.MessageBox('密码错误!', '错误', mb_OK + mb_iconstop)
else
begin
Result := True;
Table1.Close;
end;
finally
PasswordForm.Free;
end;
end;
2、SetPassword -设置用户级别和登录口令。
function SetPassword : Boolean;
var
Chgpassform : TChgpassform;
begin
Result := False;
Chgpassform := TChgpassform.Create(Self);
if Chgpassform.ShowModal = mrOK then
begin
With TablePara do
beign
{写入库中}
Edit;
Fields .AsString := EditPasswordID.Text;
Post; Close;
end;
Result := True;
Chgpassform.free;
end;
end;
----(注:限于篇幅,以上均为函数程序示意,若直接运行可能有误。)
----三、为了不在每一个应用程序中都重新写一遍函数代码,我们可以将这两个函数放进一个DLL文件chkpword.dll中,并在chkpword.dpr的projectsource中作如下声明:
expor GetPassword,SetPassword;
在包含该函数体的unit中分别作如下声明:
function GetPassword:Boolean;export;
function SetPassword:Boolean;export;
四、在应用程序的有关unit中作如下声明:
function GetPassword:Boolean;far;external'CHKPWORD';
function SetPassword:Boolean;far;external'CHKPWORD';
则引用方法为:
unit{unit名};
uses
{uses说明}
function GetPassword:Boolean;
far;external'CHKPWORD';
begin
if getpassword then
{没有设置口令或得到正确的口令后才执行程序}
begi
