对数据库DBF文件的彻底加密

Author: 求知 Date: 1997-01-01

  FoxPro数据库语言应用非常广泛,但有一个问题一直困扰着大家,那就是所有的.DBF数据库文件都是不加密的,也就是说:任何一个人都可以在FoxPro环境下用use命令打开它,并随意更改它里面的数据。
  针对这些问题,我利用了FoxPro的底层函数加密成为一个普通的二进制文件,使整个数据库不仅表头,而且表内数据均面目皆非,使非法操作者无法浏览、更改其中的数据,即使用PCTOOLS等工具软件也难以看清它的本来面目,给您的数据上了一把锁。而您自己却可以用个解密参数就能正常使用了。
#3  *加密用法:DO JJM WITH 欲加密的文件名,JIAMI
#3  *解密用法:DO JJM WITH 欲解密的文件名,JIEMI
  FUNCTION JJM
  PARAMETERS k-name,jj
  PRIVATE k-name,k-jmgo,k-jb,k-mr
  CLEA
  CLOS ALL
  IF AT(".",k-name)=0   &&判断命令行的数据库名是否有.DBF后缀,没有则加上
  k-nameq=k-name
  k-name=k-name+".DBF"
  ELSE
  k-nameq=SUBSTR(k-name,1,AT(".",k;-name)-1)
  ENDIF   &&k-nameq为数据库的主文件名
  IF USED(k-nameq)
  wait"JIAMI()不能修改已经打开的数据库,请关闭数据库"+UPPER(k-nameq)+"后再试!"; WINDOWS
  RETURN (.F.)
  ENDIF
  k-jb=FOPEN(k-name,2)   &&打开这个文件,并确定句柄
  IF k-jb=-1
  WAIT "JIAMI()由于程序目前状态原因,不能;打开这个数据库"+k-nameq+;
  "请检查您的系统环境!" WINDOWS
  RETURN (.F.)
  ENDIF
  STORE FSEEK(k-jb,0,2) TO gnend   &&把指针移到EOF
  STORE FSEEK(k-jb,0) TO gntop   &&把指针移到BOF
  IF gnend<=0   &&文件“空”吗?
  WAIT WINDOW 这个文件是空的! NOWAIT
  ENDIF
  =FSEEK(k-jb,0)   &&将文件指针移回第一个字节
  FOR COUNT=1 TO gnend
  k-mr=FREAD(k-jb,COUNT)   &&读取表头的第count字节
  =FSEEK(k-jb,COUNT-1)   &&将文件指针移到第count字节
  DO CASE
  CASE jj= jiami
  =FWRITE(k-jb,CHR(ASC(k-mr)+2 ))  &&用比原来高两位的ASCII字符改写
  CASE jj= jiemi
  =FWRITE(k-jb,CHR(ASC(k-mr)-2))   &&用比原来高两位的ASCII字符改写
  OTHER
  WAIT"请附加参数到JJM之后,JIAMI;为对文件加密,JIEMI为对文件解密"WINDOWS
  RETURN (.F.)
  ENDCASE
  ENDFOR
  =FSEEK(k-jb,0)   &&将文件指针移回第一个字节
  ?FREAD(k-jb, gnend)   &&显示变化后的文件内容
  =FCLOSE(k-jb)   &&关闭文件
  CLOS ALL
  CLEA ALL
  RETURN (.T.)
  如果您把欲改写的位数或ASCII的差数改变一下,比如做个条件判断,那么即使别人知道了你的加密方法,也不能解开你的库了,因为条件是你任意给的。具体做法我就不多说了,留给你一个思路吧!