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)
页面执行时间:3.805毫秒