Sql数据库MDF数据文件数据库恢复
2007-11-11 05:54:04 来源:WEB开发网核心提示: FOX类编程语言易学好用,在我国有着非常庞大的编制和使用队伍,Sql数据库MDF数据文件数据库恢复(2),由于其十分普及,在用资源非常丰富,就很容易暴露,其加密的可靠性就有问题,加上其排序、检索速度之快,是VB和DELPHI在数据库处理上所不及的
FOX类编程语言易学好用,在我国有着非常庞大的编制和使用队伍,由于其十分普及,在用资源非常丰富,加上其排序、检索速度之快,是VB和DELPHI在数据库处理上所不及的,因此,在未来很长一段时间里,是很难被其他语言所替代的。但其保密性差是也大家公认的。也许正是因为它的普及,只要稍为懂一点数据库知识的人,一打开数据表,其内容便一目了然,且可任意更改,其保密性和安全性可想而知。随着UNFOXpro.exe、Refox7.exe和Unfoxall等反编译软件的出现,你辛辛苦苦编的程序, 即使编译成EXE文件,一经反编译,则你煞费苦心设置的版权符、验证关、口令、密码 等都如同虚设。那么FOX类编程语言保密性差的弱点就真的没有办法避免吗?当然部是! 办法肯定有。下面就这个问题,谈谈我的看法和我所采取的一些措施:
先谈有关数据表 (DBF)(下同)的加密问题。
数据表的加解密常见的有三种方式:
1、直接在磁盘上加解密,即在关闭数据表文件后,对已保存在磁盘上的数据表文 件进行加密,在每次蚩荼砦募埃仍诖排躺隙允荼斫饷埽缓笤俟〧OX将其打开,其优点是:加解密简单容易,一般程序员用FOXPOR提供的低级文件函数都能编 出加解密程序。缺点是:在 WINDOWS的多任务环境下,很容易取得解密后的数据,且一旦系统出错,还未来得及加密就重新启动系统,那保留在磁盘上的就是解密后的数据,稍微懂得一点WINDOWS系统特性的程序员,一般不会采用此方式。
2、在内存中对数据表的字段进行加解密,这又可分两种:
A、用ASC()函数把字符转换成ASCII码,再对ASCII码进行 + - * / 运算,然后再用CHR()函数把运算后的ASCII码转换成字符,进行加解密。但这种方法有个缺点,即当加或乘时,其值容易大于255(FFH)即大于ASCII码的最大值,无法用CHR( )再转换成字符,如果对运算后大于255的数据不加密,则解密时又会带来麻烦,即同是255, 哪个是加密后的255, 哪个是未加密的255呢?这也就是有人问为何汉字解密后会出现许多 同音汉字的原因。
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
以上代码在WINDOWS 98 Microsoft Visual FoxPro 3.0以上版本通过。
3.在内存中直接对整个数据表文件(.DBF)加解密,这也有两种方法:
A.借助现成工具,犹如UCDOS SDK所提供的DBFKey()函数那样,与FOX无缝连接,不装入LoadSdk用USE是无法打开数据表的,其优点是显而易见的,但目前在WINDOWS 环境下还找不到这样的工具,而自己制作其难度大,一般程序员做不到。
B.用Vfp提供的低级文件函数,配合Create Curso -SQL 和 Insert -SQL 命令可实现类似UCDOS SDK所达到的功能,其原理是:
先用低级文件函数自定义一个文件头(或着叫文件格式,象BMP、DOC等都 有自己的文件格式),在文件头中可包含:文件头长度、字段名、字段类型、字段长度、每条记录长度、密匙(口令字)等,接着将您的记录按文件头规定的 格式加密后顺序写入文件中,由于文件格式是您自定义 的,所以一般是无法打开读取的。在使用时,用低级文件函数从您自定义的文件中先读取文件头的内容,读到字段名、字段类型、字段长度时,用Create Curso -SQL 将其到新建的数据表中,读取记录后先解密,再用Insert -SQL 到刚建的数据表中,然后就可正常使用了。结束使用需存盘时再按上述方法写入文件,该方法始终是在内存中进行的, 故即使系统出错,重新启动系统也无妨。
用这种方法加解密确实是在Vfp状态下比较好的办法,但可能由于大家对文件格式及文件头的概念不理解。实际起来有一定难度。 我根据这个办法编制的可视类(vfpjmdbf.vcx)是专为VFP3.0以上版本制作的, 对此感兴起的朋友可到我的网站:
《编程园地》 http://cfyn.yeah.net 去下载试用。
也可直接点这下载:http://vfp.3322.net/vfpgj/vfpjmdbf.zip
以上我们只谈了如何用FOX类编程语言加密数据表的问题,从中大家会看到,如果只对数据表加解密,而对执行加解密的程序代码不加密,用Unfoxall等反编译软 件将您的EXE文件反编译,那您的加解密方法及密匙(口令字),就很容易暴露,其加密的可靠性就有问题,那么如何才能加密和保护您的EXE程序呢?
下次我们继续谈这个问题。
- ››sql server自动生成批量执行SQL脚本的批处理
- ››sql server 2008亿万数据性能优化
- ››SQL Server 2008清空数据库日志方法
- ››sqlserver安装和简单的使用
- ››SQL Sever 2008 R2 数据库管理
- ››SQL SERVER无法安装成功,sqlstp.log文件提示[未发...
- ››Sql Server中通过父记录查找出所有关联的子记录
- ››SqlServer触发器、存储过程和函数
- ››SQL Server 中的事务(含义,属性,管理)
- ››Sqlite数据库插入和读取图片数据
- ››Sql server 2005拒绝了对对象 'xx表' (数...
- ››Sql server 2005拒绝了对对象 'xx表' (数...
更多精彩
赞助商链接