首页 > 范文大全 > 正文

基于VFP的数据加密之路

开篇:润墨网以专业的文秘视角,为您筛选了一篇基于VFP的数据加密之路范文,如需获取更多写作素材,在线客服老师一对一协助。欢迎您的阅读与分享!

一、前言

在目前的计算机技术日俞深入到人们的工作和生活当中的时候,为各类应用而生的应用软件日渐丰富。在各类应用软件中,数据库管理软件是应用的较广泛的软件之一。数据及数据库管理软件的安全性、保密性是成为开发、应用人员较为关心的问题之一。如何防止无关人员浏览数据库,如何防止数据库被非法修改、破坏,成为程序员首先要考虑的问题。最常用的方法是给数据库、管理程序加上密码。怎么加密码,才能使数据更安全呢,这有赖于加密得法。下面就FOX背景下的加密方法做一探讨。

二、传统的密码加密方法

从最早的dBASE到现在的Visul FoxPRO,通常都是用加密码的方法给程序、数据库加密。常见的密码有以下几种:

1、固定密码

固定密码,就是进入应用系统时的一个密码,因为是写在程序里的,所以对数据库用户而言就是固定不变的。常在用dBASE、FOXBASE、FOXPRO2.X等开发的数据库管理系统中。其核心是:拿用户输入的密码值(例如保存在PWD中)与系统设定的值进行比较,若正确,就允许进入系统,否则不允许进入系统,中间有三次改正密码的机会。此处密码值如“123456”是程序设计时给定的,所以在应用时是无法修改的,如果一定要修改,就要从源程序中更改。当然也可以编写一段子程序专门用来修改密码,修改前,一定要先判断旧密码是否正确,否则不允许更改密码,其灵活性很差。

2、简单加密的固定密码

简单加密的固定密码是指将密码进行简单的加密,但密码本身仍然是固定不变的。一般有两种形式:即“钥匙盘”法和“变换法”。“钥匙盘”法,就是把密码存放在一张软盘上,使用时把“钥匙盘”插入计算机,系统程序读取软盘中的用户名和对应的密码。或把密码和操作员姓名存到数据库中,此数据库存放于软盘内,使用时把“钥匙盘”插入计算机,系统读取软盘中的密码和操作员姓名。因为计算机硬件上已经淘汰软盘,所以都使用性能更好的U盘,现阶段的加密狗就是此方法的延伸。这种加密方法保密性要好一些,但每次使用都要用“钥匙盘”进入系统,很繁琐。

变换法,它是通过对密码进行特定的运算,使密码的显示特性发生一定变化的一种密码保护方法。常用的加密语句如:

PSD=CHR(65)+CHR(66)+CHR(67)+“9”

函数CHR(),是用来换算ASCII码的,换算后的PSD是ABC9。用这种简单的换算,可以避免密码被直接发现,保密性相对来说加强了。

3、简单加密变化的密码

以上密码都是固定的,下面利用时间函数来加密,使密码每天都不同。密码由变化的时间和固定字符构成。其核心语句为:

PWD=SUBSTR(CDOW(DATE()),1,3)+“123456”

CDOW()函数,输入年月日,返回星期几(字符型)。操作者根据今天是星期几,将星期的前3个英文字母和固定的“123456”输入,与变量PWD比较。程序会把今天的日期换算成星期数,然后取前3位,并加上“123456”,合成今天的密码变量PWD。这样就实现了每天有不同的密码。

以上几种加密方法都是传统简单的加密方法,其特点是简单、易实现、保密性差,密码单一,保护能力相对较低,主要用于Dbase到FOXPRO2x开发的程序中。由于这些软件的编译不是真正的编译,其密码容易被发现。

三、一种新型密码加密方法――可变密码

以上介绍的几种密码加密方法,密码是固定的,保密性相对较差。“可变密码”是将密码值由设置程序自行改变,形成动态的密码,由文件保存且经过加密。就是用其他工具看到显性密码,也不是真实密码。常用的加密算运算方法有:转换法、位移法、时间法、随机法等。下面具体介绍一种基于vfp6.0的密码设定方法。其特点是:具有使用登记功能;每用户一个密码,并可随时更换;密码经加密运算,不易被破解。

首先建立两个数据库(table),一个用来存放口令及对应的用户名(称为“口令库”),另一个存放用户登录使用情况(称为“登录库”)。再建立两个窗口(form),一个用来检查口令,另一个用来修改口令。接下来定义两个过程(procedure),一个用来给口令加密(“加密过程”),另一个用给口令解密(“解密过程”)。“加密过程”是把密码经加密运算后存入口令库,“解密过程”实际上是把输入的密码经加密运算后与口令库内的密码进行比较,并不解密。为了使密码输入时不被看见,密码输入时显示隐性文字。“解密过程”基本代码如下:

parameter password

pas=“”

n1=asc(substr(name,1,1)) &&取姓名的第一个拼音字母,换算成ASCII码

n2=asc(substr(name,2,1)) &&作为加密的键值

n3=asc(substr(name,3,1))

n=int((n1+n2+n3)/3)

for i=1 to len(trim(password)) &&使用BITXOR()函数对密码进行解密

tempchr=bitxor(asc(substr(password,i,1)),n)

pas=pas+chr(tempchr)

endfor

locate for klk.user_id=name&&与口令库内的与姓名相对应的口令进行比较

if (klk.keypas) and (password“hg”)

result=.f.

else

result=.t.

endif

return result

bitxor ()函数是vfp特有的函数,它将函数的两个参数转换成二进制数,并且执行“与”操作,返回一个十进制的结果。加上密码键值n(此处是取姓名的第一个拼音字母,经求和,再取平均值,再取整运算,换算成ASCII码),得到每人一个的密码。加密过程是解密过程的逆运算,基本代码如下:

parameter password

pas=“”

for i=1 to len(trim(password))

n1=asc(substr(name,1,1))

n2=asc(substr(name,2,1))

n3=asc(substr(name,3,1))

n=int((n1+n2+n3)/3)

tempchr=bitxor(asc(substr(password,i,1)),n)

pas=pas+chr(tempchr)

endfor

replace key with pas

检查密码的思路是:先到输入姓名的文字框内取姓名,再到口令库内查找姓名,如果找不到姓名,返回消息窗口“您不是指定用户,请与系统管理员联系!”,系统退出;如果找到了用户姓名,则继续进行。把输入的口令和姓名送到“解密过程”中进行运算,“解密过程”将其解密,并与口令库内的数据进行比较,如果不正确,开始计数,要求重新输入密码,三次不正确,退出系统。如果正确,释放当前窗口,进入系统。主要代码如下:

name=trim(ThisForm.Text1.value)

if empty(name)

a=messagebox(“请输入用户名!”,0+48,“信息窗口”)

ThisForm.Text1.setfocus

return

endif

pass=trim(ThisForm.Text2.value)

if empty(pass)

a=messagebox(“请输入口令!”,0+48,“信息窗口”)

ThisForm.Text2.setfocus

return

endif

use klk

locate for klk.user_id=name

if found()=.f.

a=messagebox(“你不是指定用户,请与系统管理员联系!”,64,“提示信息”)

Thisform.release

else

ok=Thisform.decode(pass)

if ok=.t.

ThisForm.Label3.caption=“欢迎使用!”

wait window ‘欢迎使用!按任意键进入“系统维护模块。”’

releasethisform

do formwh_wh

else

if m=3

m=m+1

ThisForm.Label3.caption=“口令错,您无权使用”

a=messagebox(“对不起,您无权使用!”,0+48,“信息窗口”)

releasethisform

else

a=messagebox(“口令错,请重新输入!”,0+48,“信息窗口”)

ThisForm.Text2.value=“”

ThisForm.Text2.setfocus

m=m+1

endif

endif

endif

改变密码的思路是:首先读取用户姓名,如果是新用户则请用户输入新密码,并记录下获得新密码的时间;如果是老用户,则读取用户旧密码,将旧密码进行解密运算并和口令库内容比较,如果正确,请用户输入新密码,并将新密码通过解密运算存入口令库,并记录修改时间。主要代码如下:

name=ThisForm.Text3.value

oldpass=ThisForm.Text1.value

newpass=ThisForm.Text2.value

if isblank(newpass)

a=messagebox(“请重新输入新密码!”,64,“信息提示”)

ThisForm.Text1.setfocus()

return

endif

success=thisform.decode(oldpass)

if notsuccess

a=messagebox(“旧密码不正确,重新输入密码!”,64,“信息提示”)

ThisForm.Text1.setfocus()

return

endif

locate for klk.user_id=name&&newuserlogo

if found()=.f.

a=messagebox(“您是新用户!”,64,“信息提示”)

append blank

replace klk.user_id with name,klk.logo_d date with date()

thisform.text3.setfocus

endif

thisform.Encode(newpass)

a=messagebox(“旧密码已经修改完成,下次请使用新密码!”,64,“信息提示”)

mand2.setfocus

return

在改变密码的窗口(form)中,要定义“加密过程”和“解密过程”,方法如上所述。

以上是一个加密算法的主要思路和关键代码,这个加密算法还可以进一步完善,如采用不同的函数进行运算。例如加入日期,使每个人每天的密码都不一样,用CDOW()函数作为键值的一部分,这样安全性就更胜一筹。

世界上还没有破解不了的密码,只是采用不同的设计方法,使破解的难度更大一些。矛与盾的较量永远不会停止,一切都是运动中的一个暂时平衡。路在延续,而且一直延续……。(作者单位:长江工程职业技术学院)