📄 password.htm
字号:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>为应用程序添加口令</title>
</head>
<body bgcolor="#FFFFFF" text="#000000">
<p align="center"> <font color="#0000c0"></p>
<h2 align="center">为 应 用 程 序 添 加 口 令 </font></h2>
<h3 align="center">北 京 燕 山 石 化 计 算 中 心 软 件 开 发 部<br>
吕 彤 </h3>
<p><font color="#ffffff">----</font> 不 知 您 是 否 曾 为 数 据 被 人 盗 用
而 苦 恼; 不 知 您 是 否 因 软 件 没 有 一 套 严 密<br>
的 安 全 防 护 系 统 而 不 敢 放 心 使 用; 不 知 您 是 否 曾 经 费
尽 心 机 作 过 数 据 加 密<br>
但 是 对 加 密 效 果 大 不 满 意 ? 如 果 您 曾 有 过 诸 如 此 类
的 困 惑 的 话,Delphi 为 您<br>
提 供 了 一 个 简 单 而 出 色 的 解 决 办 法。 </p>
<p><font color="#ffffff">----</font> 这 似 乎 是 在 吹 嘘 Delphi 的 功 能, 但
Delphi 的 所 有 版 本 无 一 例 外 地 提 供 了 对 其<br>
Paradox 数 据 库 的 口 令 设 置, 设 置 过 口 令 的 Paradox 数 据 库 的
数 据 也 被 加 密 而 无<br>
法 用 其 它 工 具 查 看。 这 一 特 性 使 得 我 们 用 Delphi 提 高 应
用 程 序 的 安 全 性 变 得<br>
简 单 易 行。 不 过 要 说 明 的 是: 本 方 法 所 论 的 加 密 并 非
万 无 一 失, 因 为 电 脑<br>
黑 客 们 无 所 不 在, 他 们 可 以 轻 易 地 打 破 你 的 任 何 加 密
方 法, 但 就 一 般 人 而<br>
言 本 文 所 论 的 加 密 方 法 就 足 够 了。 </p>
<p><font color="#ffffff">----</font> 一、 首 先, 一 套 软 件 的 安 全 性 包
括 对 数 据 访 问 的 限 制。 未 授 权 的 用 户 不<br>
能 访 问 其 中 的 某 些 数 据 或 者 根 本 不 能 进 入 应 用 程 序。
据 此 可 以 设 计 一 个 数<br>
据 表, 用 来 存 储 用 户 的 级 别、 用 户 的 登 录 名 称 以 及 用
户 密 码, 不 妨 将 此 表<br>
命 名 为 PARA.DB。PARA.DB 的 结 构 如 下: </p>
<pre>字段名 字段类型 字段长度注释
Owner A 20 应用程序名
User A 10 用户名
UserLevel A 10 用户级别
PasswordID A 10 登录口令</pre>
<p><font color="#ffffff">----</font> 考 虑 到 您 开 发 的 应 用 程 序 可 能
不 止 一 个, 所 以Owner 字 段 用 来 识 别 PARA.DB<br>
所 属 的 应 用 程 序 以 防 止 一 个 PARA.DB 能 适 用 于 所 有 应 用
程 序; 后 三 个 字 段 用<br>
来 给 用 户 设 置 使 用 权 限。 所 有 的 字 段 都 十 分 重 要, 但
是 如 果 您 的 应 用 程 序<br>
是 单 用 户 的、 只 需 要 一 个 简 单 的 口 令 的 话 则 可 以 省 略User、Userlevel
甚 至Owner 字<br>
段 而 只 留 一 个 登 录 口 令 字 段PasswordID。 </p>
<p><font color="#ffffff">----</font> 二、 然 后, 我 们 需 要 两 个 函 数: </p>
<p><font color="#ffffff">----</font> 1、GetPassword - 读 取 用 户 的 输 入, 并
判 断 口 令 的 正 确 性 和 用 户 的 级 别。 </p>
<pre>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[3].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[2].AsString := EditPasswordID.Text;
Post;
Close;
end;
Result := True;
Chgpassform.free;
end;
end;</pre>
<p><font color="#ffffff">----</font> ( 注: 限 于 篇 幅, 以 上 均 为 函 数
程 序 示 意, 若 直 接 运 行 可 能 有 误。) </p>
<p><font color="#ffffff">----</font> 三、 为 了 不 在 每 一 个 应 用 程 序
中 都 重 新 写 一 遍 函 数 代 码, 我 们 可 以 将 这<br>
两 个 函 数 放 进 一 个DLL 文 件chkpword.dll 中, 并 在chkpword.dpr 的project
source 中 作 如 下 声<br>
明: </p>
<pre>exports 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
{没有设置口令或得到正确的口令后才执行程序}
begin
{程序段代码}
.
.
.
{或:SetPassword}
end;
end.
</pre>
<p><font color="#ffffff">----</font> 五、 注 意 事 项 </p>
<p><font color="#ffffff">----</font> 1、 当 您 用DataBase DeskTop 创 建para.db 的
时 候, 请 注 意 为 其 添 加 密 码mypassword。 在<br>
应 用 程 序 的project source 中 或 调 用para.db 之 前 您 必 须 用
Session.AddPassword('mypassword'); 来<br>
为para.db 作 好 开 启 准 备, 以 免 用 户 发 现paradox 提 供 的 登 录
对 话 框。 </p>
<p><font color="#ffffff">----</font> 2、 用 本 方 法 所 作 的 口 令 是 对 大
小 写 敏 感 的, 这 一 点 请 在 编 制 程 序 的 时<br>
候 予 以 充 分 的 注 意。 若 要 避 免 大 小 写 敏 感 请 改 写 口 令
判 断 代 码 为: </p>
<p><font color="#ffffff">----</font> UpperCase(EditInputPass.Text) < >
UpperCase(TablePara.fields[3].asstring) </p>
<p><font color="#ffffff">----</font> 3、 要 想 分 别 在delphi 1.0 至 3.0 开 发
的 应 用 程 序 中 调 用 这 两 个 函 数, 最 方 便 的<br>
办 法 是 在 不 同 版 本 的delphi 中 分 别 编 译chkpword.dpr。 </p>
<p><font color="#ffffff">----</font> 这 样, 我 们 就 利 用delphi 的paradox 数
据 库 为 我 们 提 供 的 加 密 功 能 轻 松 地 给 应<br>
用 程 序 加 上 了 安 全 性 维 护 模 块。 </p>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -