您当前位置:设计在线网 >> 自动控制理论 >> 浏览文章

利用库文件头对.DBF文件加密

分享到:
本文章讲述了利用库文件头对.DBF文件加密.

DBF文

件加密

利用库文件头对.DBF文件加密随着数据库管理技术的日渐成熟,数据库加密技术也日臻完善。在实际应用中,采取一定的加密手段可有效地防止系统的非法拷贝和非法扩散。但是,由于大多数软件开发者往往将加密手段着重于系统和用户的合法性上,却给了.DBF文件以极大的自由,以至一些非法用户不用进入系统仍能篡改某些重要数据,所以笔者认为有必要对库文件也采取相应的密钥处理。

同其它文件一样,对.DBF文件加、解密方法也有多种,一般都借助汇编子程序通过应用系统调用来完成。由于数据库系统调用执行汇编子程序速度较慢,因此在具体编程过程中,应注重加密算法的简单和有效性,且汇编子程序编得尽量隐蔽复杂,比如用C、Turbo Pascal等高级语言来编写,以及在程序中采用设置陷阱或标志、给子程序更名等措施来保证加密的效果。下面就将笔者在实际工作中经常使用的方法简单地介绍一下。

.DBF文件由库结构描述段和库记录两部分组成,而库结构描述段又包括1个文件头、多个域描述块和1个域结束符。其中文件头结构如下:0 13 47 89 10 11 12 31 03H库文件标志更新日期记录个数头结构长度记录长度保留据此文件头结构,只要我们将其0字节修改为其它值,则数据库系统就会否认该文件为库文件而不予打开,并且当其他的任一字节遭到破坏时也会导致该库文件的毁灭。笔者就是利用这些特性用它的某些关键字节作为密钥来进行加密、解密的,经过长期试用效果颇佳,所以特将所用源程序附后,建议大家一试。

例程1:******FoxBASE command file demo.prg set esca off set debug off if file('secu.dbf')rena secu.dbf to secu.bin else wait'Unauthor ized duplication!'quit endif load secu call secu with'0ct.dbf'&&最后用空格来表示文件名的结束,0表示解密use ct brow use call secu with'lct.dbf'&&1表示加密call secu with'lct.dbf'&&该汇编子程序能自动识别是否重复加解密而妥善处理rena secu.bin secu.dbf quit return例程2:;assembly file secu.asm;usage:;masm secu;link secu;exe2bin secu.exe secu.bin;因FoxBASE+中LOAD/CALL命令的运行速度比RUN/!快得多;

ren secu.bin secu.dbf code segment para public'code'assume cs:code,ds:code org 0start proc far push ax push bx push cx push dx push ds push di push bx mov di,0 b:inc bx mov al,ds:cmp al,20h jz az mov cs:file[di],al inc di jmp baz:pop bx mov al,ds:push cs pop ds cmp al,30h;解密jz ct cmp al,31h jz jm;加密jmp en jm:mov ax,3d02h mov dx,offset file int 21h jc en mov bx,ax mov ah,3fh mov cx,0080h mov dx,200h int 21h mov dx,0200h mov cl,[dx]xor cl,03 jnz en mov cl,[dx];文件头第一字节为FoxBASE+标志mov ch,[dx+10];文件头第十字节为记录长度的低字节mov[dx],ch;两者交换使.DBF文件不为FoxBASE所承认达到mov[dx+10],cl;加密的目的mov cl,[dx]mov ch,[dx+8];

文件头第八字节为头结构长度的低字节mov[dx],ch mov[dx+8],cl;进一步加密mov dx,0200h mov cx,ax mov ah,40h int 21h mov ah,3eh int 21h jmp en ct:mov ax,3d02h;解密过程mov dx,offset file int 21h jb en U:mov bx,ax mov ah,3fh mov cx,0080h mov dx,200h int 21h mov dx,200h mov cl,[dx]xor cl,03 jz en mov cl,[dx]mov ch,[dx+8]mov[dx],ch mov[dx+8],cl mov cl,[dx]mov ch,[dx+10]mov[dx],ch mov[dx+10],cl mov dx,200h mov cx,ax mov ah,40h int 21h mov ah,3eh int 21h en:pop di pop ds pop dx pop cx pop bx pop ax retf file db 11 dup(0)start endp code ends end start*****

(计算机世界报1994年第43期)最近给公司做了一个工资系统,拿给公司的劳资员用,因为是几个人共用一台电脑,所以我的工资系统设置了密码,只有通过输入正确的密码才能进入工资系统。现在遇到一个问题就是:如果不知道密码的非法用户不直接进入工资系统,而是通过我放gzsj.dbf的文件夹来直接打开gzsj.dbf文件,从而修改里面的内容怎么办?

因为经常要变动gzsj.dbf里的数据,所以又不能把gzsj.dbf这个表包含在项目中而把他和其他程序连编成一个整体。那样的话在进入工资系统后就不能修改gzsj.dbf里的内容了。所以想对DBF表进行加密或解密。---*前提:被操作的表如果已经打开,一定要先关闭

*---DBF_JM('temp.dbf',1)&&加密DBF_JM('temp.dbf',0)&&解密FUNCTION DBF_JM PARAMETERS filename,jm IF AT('.',filename)=0 filename=filename+'.dbf'&&处理文件名ENDIF IF jm=1&&加密handle=FOPEN(filename,2)&&打开文件keybite=FREAD(handle,1)&&读表头第一个字节=FSEEK(handle,0)&&指针移回第一个字节=FWRITE(handle,CHR(ASC(keybite)+2))&&用比原来高2的ASCII字符改写=FCLOSE(handle)&&关闭文件ELSE&&解密handle=FOPEN(filename,2)keybite=FREAD(handle,1)=FSEEK(handle,0)=FWRITE(handle,CHR(ASC(keybite)-2))&&用比原来低2的ASCII字符改写=FCLOSE(handle)ENDIF ENDFUNC*---FUNCTION DBF_JieMi&&解密PARAMETERS lfile lfn=ALLTRIM(lfile)lh=FOPEN(lfn,12)=FSEEK(lh,0,0)=FSEEK(lh,8)lk1=FREAD(lh,1)lk2=FREAD(lh,1)=FSEEK(lh,0,0)=FSEEK(lh,8)=FWRITE(lh,CHR(ASC(lk1)-2),1)=FWRITE(lh,CHR(ASC(lk2)-2),1)=FCLOSE(lh)RETURN ENDFUNC FUNCTION DBF_JiaMi&&加密PARAMETERS lfile lfn=ALLTRIM(lfile)lh=FOPEN(lfn,12)=FSEEK(lh,0,0)=FSEEK(lh,8)lk1=FREAD(lh,1)lk2=FREAD(lh,1)=FSEEK(lh,0,0)=FSEEK(lh,8)=FWRITE(lh,CHR(ASC(lk1)+2),1)=FWRITE(lh,CHR(ASC(lk2)+2),1)=FCLOSE(lh)RETURN ENDFUNC

推荐阅读:
各种排序算法总结
《算法导论》--优先级队列数据结构基础
GIS算法源码集合介绍
推荐文章  
赞助商链接  
热门排行  
主题推广  
中国设计在线网 All Rights Reserved. 互联网违法和不良信息举报
信息产业部备案号:湘ICP备09001063号