微信公众号 
图码生活

每天发布有五花八门的文章,各种有趣的知识等,期待您的订阅与参与
电脑报 1992-2001 十年文章全集
电脑报 1992-2001 十年文章全集
包含从 1992 年 - 2001 年间,两万余篇期刊文章,查询最少输入两个字符
随便看看
读取中
读取中
标题对数据库DBF文件的彻底加密
栏目软件大世界
作者求知
发布1997-01-01
  FoxPro数据库语言应用非常广泛,但有一个问题一直困扰着大家,那就是所有的.DBF数据库文件都是不加密的,也就是说:任何一个人都可以在FoxPro环境下用use命令打开它,并随意更改它里面的数据。
  针对这些问题,我利用了FoxPro的底层函数加密成为一个普通的二进制文件,使整个数据库不仅表头,而且表内数据均面目皆非,使非法操作者无法浏览、更改其中的数据,即使用PCTOOLS等工具软件也难以看清它的本来面目,给您的数据上了一把锁。而您自己却可以用个解密参数就能正常使用了。
  *加密用法:DO JJM WITH 欲加密的文件名,JIAMI
  *解密用法: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的差数改变一下,比如做个条件判断,那么即使别人知道了你的加密方法,也不能解开你的库了,因为条件是你任意给的。具体做法我就不多说了,留给你一个思路吧!