Welcome

首页 / 软件开发 / VFP / visual foxpro 7全新登场-数据安全

visual foxpro 7全新登场-数据安全2007-05-09说在前面

一直想写一些关于Visual FoxPro 7 的东西,但下不了笔。原因有二:一是工作繁忙,懒得动笔,再就是Visual FoxPro 7的新特性并不浮于表面,一时很难体会,更谈不上写成文章了。

困难重重,还是要写。我不是专业的Visual FoxPro 的程序员,我是一个爱好者,所以我没有专业程序员的种种顾虑:版本问题、兼容性问题、可靠性问题;Visual FoxPro 7作为Visual FoxPro 3以来最重要、变化最深刻的版本,是值得我们深入研究的。从这次起我将分专题与大家讨论一些Visual FoxPro 7的新特征,希望大家喜欢。

正文

DBF类数据库(文件)的不安全与它的快速、灵活、强大都是从“娘胎”里带来的,可以说是很难改变。MS这次推出的Visual FoxPro 7 是一个很棒的产品(我的意见),它试图通过其他方式改善DBF数据的这一缺点。

1.数据库事件(DBC Event)

首先是Visual FoxPro 7最亮丽特色--数据库事件,事件驱动是Windows的运作模式,有位Delphi高手自豪的对我说:在Windows下的开发工具的好坏就看它对事件的封装,显然Delphi是最好的。Visual FoxPro 7 7引入了数据库事件,可以这样说:从此对DBC的管理将进入新的时代(当然有一个DBC对象就更好了!)。

关于数据库事件的详细内容可以查看Visual FoxPro 7自带的实例:HOME()+"samplesolution"。

2.数据库事件并不总是有效的

Visual FoxPro 6以及更老的版本不支持数据库事件,(数据库事件将被忽略);同时,Visual FoxPro的ODBC与OLE DB驱动程序也不支持数据库数事件;即使是Visual FoxPro 7本身,数据库事件也不总是有效的,你可以通过两种方式关闭数据库事件:

A.DBSetProp(<DBCName>,"Database","DBCEvents",.F.)

B.图形界面中不要选中 Set Event On(如图3)

所以仅仅依靠数据库事件作安全管理是不够的。从一开始我就觉得数据库事件主要应用于数据库管理而不是强调安全管理--这是防君子不放小人的。

3._crypt.vcx加密类

这是Ms为我们封装的数据加密类,支持字符串与文件的加密,是对windows的API的封装,代码很是复杂,我是没空看,我只会拿来用(这才是RAD的精髓)。

关于它的用法,大家可以参看:DO FORM HOME(2)+"solutionffccrypto.scx"

4.结合数据库事件与_crypt.vcx加密类

在今年的 Visual FoxPro 开发者会议上,微软Fox小组演示了一种理念:结合“数据库事件”与“_crypt.vcx加密类”的数据安全模式。它的思路是:数据安全由“_crypt.vcx加密类”完成,但什么时候加密、解密由“数据库事件”管理。

这种做法的好处是:

  1. 跳过“数据库事件”,加密的数据就不会被解密,看见的将是一堆乱码

  2. 数据库事件为管理加密、解密提供了良好的管理机制,减少程序工作量。只要是数据库事件可用,就没有任何行径可以逃脱事件机制

面是我写的一个例程:

想要书写数据库事件可以通过如下步骤:

  1. 打开数据库容器(图1)

  2. 右击,弹出菜单。选择“属性”。(图2)

  3. 选中Set Event On(图3)

  4. 双击某一个数据库事件名称


图1


图2


图3

这里我们建立两个数据库事件:
*数据库事件代码
*如果打开“雇员”表,则要求输入口令,只有当口令是“Admin”时才解密“姓名”字段
PROCEDURE dbc_AfterOpenTable(cTableName)
*After a table or view is opened.
LOCAL cEncrypt as String
LOCAL ox as Object

IF cTableName="雇员"
IF ALLTRIM(INPUTBOX("请输入数据库用户口令","Visual FoxPro 7 的安全改进!","USER"))=="Admin"
ox=NEWOBJECT("_cryptapi",HOME()+"ffc\_crypt.vcx")
UPDATE 雇员 set 姓名=IIF(ox.decryptsessionstreamstring (姓名,"1234",@cEncrypt),cEncrypt,姓名)
RELEASE ox
UPDATE 标志 set 标志值=0 WHERE 标志ID=1
ENDIF
ENDIF

ENDPROC


*关闭“雇员”表前,加密“姓名”字段
PROCEDURE dbc_BeforeCloseTable(cTableName)
*Just before a table or view is closed.
LOCAL cEncrypt as String
LOCAL ox as Object
IF cTableName="雇员"
SELECT 标志值 FROM 标志 WHERE 标志id=1 INTO ARRAY myarray
IF myarray[1]=0
ox=NEWOBJECT("_cryptapi",HOME()+"ffc\_crypt.vcx")
UPDATE 雇员 set 姓名=IIF(ox.encryptsessionstreamstring(姓名,"1234",@cEncrypt),cEncrypt,姓名)
UPDATE 标志 set 标志值=1 WHERE 标志ID=1
ENDIF
ENDIF

ENDPROC
*End 数据库事件代码

5.一些思考(不考虑应用程序的反编译)

A.这段代码存放在数据库容器DBC中安全吗?

当然不安全。还好 Visual FoxPro 7允许将数据库事件代码写在PRG文件里,编译到程序中。

B._crypt.vcx加密、解密速度

我做了试验(Win2000 server- 阿沙龙 1.2G CPU- 256MDDR 内存),程序方式与上例相同(Scan-EndScan-Replace 更慢):
加密宽度为20的字段,记录数量为30,000条,加密需要9.04秒,解密时间与加密差不多。所以,不合适大量数据经常性加密、解密。

C._crypt.vcx的适用性

对于用户口令表,这类小表是很合适的;对于大量数据归档加密也是合适的。

4.支持中文加密解密