Database 版 (精华区)
发信人: mengy (LEAR DLLS 命令时,将从内存中清除), 信区: Database
标 题: 关于VFP的加密
发信站: 哈工大紫丁香 (2000年12月13日09:22:29 星期三), 站内信件
关于VFP的加密
老王
Vfp语言易学好用,其排序、检索速度之快,是VB和DELPHI所不及的,但其保密性
差是也大家公认的。只要稍为懂一定数据库知识的人,一打开数据表,其内容便一
目了然,且可任意更改,其保密性和安全性可想而知,这还只是其一。其二:随着
UNFOXpro.exe和Refox7.exe等的出现,你辛辛苦苦编的程序,即使编译成EXE文件
,一经UN或RE则你煞费苦心设置的版权符、验证关、口令、密码等都如同虚设。
那么Vfp的保密性差的弱点就没办法避免吗?NO !办法肯定有,这里就先谈谈“数
据表的加密问题”,以下就是我的一点粗浅看法,请网友们踊跃讨论。
数据表加解密常见的有以下两种方式:
1、直接在磁盘上加解密,即在关闭数据表文件后,对已保存在磁盘上的数据表文
件进行加密,在每次打开数据表文件前,先在磁盘上对数据表解密,然后再供
Vfp将其打开,其优点是加解密容易,一般程序员用Vfp提供的低级文件函数都能编
出加解密程序;缺点是:在WIN的多任务环境下,很容易取得解密后的数据,另外
一旦系统出错,还未来得及加密就重新启动系统,那保留在磁盘上的就是解密后的
数据,对保密性能要求稍微高一些的程序员,一般不会采用此方式。
2、在内存中对数据表的字段进行加解密,这又可分两种:
A、象《远程续缘》1999年第一期 第8个问题那样用ASCII码进行+、-、*、/运算加
解密,但这种方法有个缺点即当加或乘时,其值容易大于255(FFH)即大于ASCII码
的最大值,这时无法用CHR()换成字符保存,如对大于255的数据不加密,则解密时
又会带来麻烦,即同是254,哪个是加密后的254,哪个是未加密的254?这也就是
为何有人问汉字解密后会出现许多同音汉字的原因。
B、完全利用Vfp3.0以上版本提供的位操作函数bitxor()进行加密,该加密方法是
C语言及汇编语言常用的加密方法,其原理是将一字节的8位二进制数与另一个二进
制数进行异或操作,如用6个以上密匙(口令)进行加密,则在不知其密匙的情况下
,是很难解密的。它还有一个优点是加解密用同一模块,即一次执行是加密,再次
执行为解密。以下是加解密例程( 注:调用该过程时,需加密的数据表已打开,
且为当前工作区):Procedure jjmgc
para Pass &&Pass是密匙,设Pass='wjgwkj'
priv all
mccd=len(Pass) &&取Pass密匙长度
Sjbzds=fcou()
Dime Jmsz(Sjbzds)
Go top
Scan
Scat to Jmsz &&读一条记录到数组
For I=1 to Sjbzds
If type("Jmsz(i)")="C" &&该字段是字符型吗
Zdcd=len(trim(Jmsz(i))) &&取字段长度
mc1=1
For x=1 to Zdcd
Jm1=asc(subs(Jmsz(I),x,1)) &&取字段中一个字节
jm2=asc(subs(Pass,mc1,1)) &&取Pass中一个字节
jmjg= chr(bitxor(jm1,jm2)) &&将JM1按JM2的值异或
Jmsz(I)=stuf(Jmsz(I),x,1,jmjg) &&进行加密替换
mc1=iif(mc1>mccd,1,mc1+1) &&判断MC1是否大于mCCD
Endf
Endi
Endf
Gath from Jmsz &&将加解密的数据,写入当前记录
Ends
retu
3、在内存中直接对整个数据表文件(.DBF)加解密,这也有两种方法:
A、借助现成工具,犹如UCDOS SDK所提供的DBFKey()函数那样,与FOX无缝连接,
不装入LoadSdk用USE是无法打开数据表的,其优点是显而易见的,但目前在WIN环
境下还找不到这样的工具,而自己制作其难度大,一般程序员做不到。
B、用Vfp提供的低级文件函数,配合Create Curso -SQL 和 Insert -SQL 命令可
实现类似UCDOS SDK所达到的功能,其原理是:
先用低级文件函数自定义一个文件头(或着叫文件格式,象BMP、DOC等都有自己的
文件格式),在文件头中可包含:文件头长度、字段名、字段类型、字段长度、每
条记录长度、密匙(口令字)等,接着将您的记录按文件头规定的格式加密后顺序写
入文件中,由于文件格式是您自定义的,所以一般是无法打开读取的。 在使
用时,用低级文件函数从您自定义的文件中先读取文件头的内容,读到字段名、字
段类型、字段长度时,将其用Create Curso -SQL到新建的数据表中,读取记录后
先解密,再用Insert -SQL 到刚建的数据表中,然后就可正常使用了,结束使用需
存盘时再按上述方法写入文件。
该方法始终是再内存中进行的,故即使系统出错,重新启动系统也无妨。用这种方
法加解密确实是在Vfp状态下比较好的办法,但可能对于没学过C语言或汇编的朋友
,对文件格式等不理解,由于代码较长,无法列出,如网友们有兴趣,我可供《天
堂软件俱乐部》发放。
以上只是我对Vfp数据保密性问题的探讨之一 —— 数据表加解密,从中大家会看
到,如果只对数据表加解密,而对执行加解密的程序代码不加密,或用Refox等软
件将您的EXE文件反编译,那您的加密方法及密匙(口令字),就很容易暴露,其加
密的可靠性就有问题,这就是我要讲的第二个问题:
如何加密和保护您的程序
如果您有何高见,请到焦点论坛发表,谢谢!
返回
--
大海无边天做岸
山登绝顶我为风
※ 来源:·哈工大紫丁香 bbs.hit.edu.cn·[FROM: 202.118.227.121]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:2.880毫秒