数据库

本类阅读TOP10

·SQL语句导入导出大全
·SQL Server日期计算
·SQL语句导入导出大全
·SQL to Excel 的应用
·Oracle中password file的作用及说明
·MS SQLServer OLEDB分布式事务无法启动的一般解决方案
·sqlserver2000数据库置疑的解决方法
·一个比较实用的大数据量分页存储过程
·如何在正运行 SQL Server 7.0 的服务器之间传输登录和密码
·SQL中两台服务器间使用连接服务器

分类导航
VC语言Delphi
VB语言ASP
PerlJava
Script数据库
其他语言游戏开发
文件格式网站制作
软件工程.NET开发
數据庫加密与解密技術之一 FOXPRO篇

作者:未知 来源:月光软件站 加入时间:2005-2-28 月光软件站

     數据庫加密与解密技術之一 FOXPRO篇
作者:  CCBZZP

      在現實的應用中, 數据的安全是很重要的, 特別是象銀行等保密性非常重要的部門,
所以對數据的加密就特別重要, 筆者在長期的應用中總結出各种數据庫的加密和解密的
寫法, 希望對大家有幫助, 同時也和大家一起探討, 一起學習, 共同進步!

      FOXPRO為用戶提供一些低級的文件操作函數,利用這些低級的操作函數用戶可以實現對低級文件的操作,這些低級的函數主要有: FCLOSE(),FCREATE(),FEOF(),FERROR(),FFLUSH(),FGETS(),FOPEN(),FPUTS(),FREAD(),FSEEK(),STRTOFILE()等,這些函數的具体用法在此就不具体的描述,在下面的文章中會利用這些函數的.

1. 對數据進行加密

下面以修改一個用戶的密碼為例來說明:

程序CHANG_PASSWORD的CLICK()內容:

IF VARTYPE(m.id_man)<>'C' .OR. VARTYPE(m.id_psd)<>'C'
 =MESSAGEBOX('妳還沒有註冊﹗不可以變更密碼﹐',0+48+0,'信息提示﹗')=6
 RETURN
ELSE
 SELECT &father_table.
 LOCATE FOR ALLTRIM(id_man)==ALLTRIM(m.id_man) ;
  .AND.

ALLTRIM(THIS.PARENT.encrypt_data.CLICK(id_psd,m.id_man))==ALLTRIM(m.id_psd) ;
  .AND. !DELETED()
 IF FOUND()
  IF ALLTRIM(m.new_password1)==ALLTRIM(m.new_password2)
   REPLACE &father_table..id_psd WITH

THIS.PARENT.encrypt_data.CLICK(m.new_password1,m.id_man)
   =MESSAGEBOX('密碼變更成功﹗',0+48+0,'信息提示﹗')
  ELSE
   =MESSAGEBOX('密碼沒有變更﹗兩次新密碼不一致﹗',0+48+0,'信息提示﹗

')
  ENDIF
 ELSE
  =MESSAGEBOX('密碼沒有變更﹗舊密碼錯誤﹗',0+48+0,'信息提示﹗')
 ENDIF
ENDIF
THIS.PARENT.RELEASE()

 


程序encrypt_data的CLICK()內容:

LPARAMETERS encrypt_password , encrypt_chr
encrypt_chr=ALLTRIM(UPPER(encrypt_chr))
encrypt_chr1='340821960120581'
encrypt_long=LEN(encrypt_chr1)
encrypt_chr2=LEFT(encrypt_chr+encrypt_chr+encrypt_chr+encrypt_chr,encrypt_long)
THIS.return_data=''
FOR i=1 TO encrypt_long STEP 1
alteration_chr=CHR(BITXOR(ASC(SUBST(encrypt_chr1,i,1)),ASC(SUBST(encrypt_chr2,i,1))))
 

THIS.return_data=THIS.return_data+CHR(BITXOR(ASC(SUBST(encrypt_password,i,1)),ASC(alterati

on_chr)))
ENDFOR
RETURN THIS.return_data


2. 對數据庫文件進行加密
假如存在數据庫文件C:\USERS.DBF;

HANDLE1=FOPEN("C:\USERS.DBF")
IF HANDLE1<0
   MESSAGEBOX("沒有找到指定文件...",0+64,"信息提示!")
   RETURN
ENDIF
I=1
HANDLE2=FCREATE("C:\USERS.DBF")
DO WHILE .T.
   =FSEEK(HANDLE1,I*32)
   RETASC=FREAD(HANDLE1,32)
   IF ASC(RETASC)=13
      EXIT
   ENDIF
   I=I+1
ENDDO
=FSEEK(HANDLE1,0)
RETSTR=FREAD(HANDLE,I*32)
=FWRITE(HANDLE2,RETSTR)
X=I*32
J=0
DO WHILE .NOT. FEOF(HANDLE1)
   =FSEEK(HANDLE1,X+J)
   RETASC=FREAD(HANDLE1,1)
   IF ASC(RETASC)>253
      CH=CHR(255-ASC(RETASC))
   ELSE
      CH=CHR(ASC(RETASC)+2)
   ENDIF
   =FWRITE(HANDLE2,CH)
   J=J+1
ENDDO
MESSAGEBOX("加密成功...",0+64,"信息提示!")
=FCLOSE(HANDLE1)
=FCLOSE(HANDLE2)
RETURN

 

3. 對數据庫文件進行解密
假如存在數据庫文件C:\USERS.DBF;

HANDLE1=FOPEN("C:\USERS.DBF")
IF HANDLE1<0
   MESSAGEBOX("沒有找到指定文件...",0+64,"信息提示!")
   RETURN
ENDIF
HANDLE2=FCREATE("C:\USERS.DBF")
I=1
DO WHILE .T.
   =FSEEK(HANDLE1,I*32)
   RETASC=FREAD(HANDLE1,32)
   IF ASC(RETASC)=13
      EXIT
   ENDIF
   I=I+1
ENDDO
=FSEEK(HANDLE1,0)
RETSTR=FREAD(HANDLE,I*32)
=FWRITE(HANDLE2,RETSTR)
X=I*32
J=0
DO WHILE .NOT. FEOF(HANDLE1)
   =FSEEK(HANDLE1,X+J)
   RETASC=FREAD(HANDLE1,1)
   IF ASC(RETASC)<2
      CH=CHR(255-ASC(RETASC))
   ELSE
      CH=CHR(ASC(RETASC)-2)
   ENDIF
   =FWRITE(HANDLE2,CH)
   J=J+1
ENDDO
MESSAGEBOX("解密成功...",0+64,"信息提示!")
=FCLOSE(HANDLE1)
=FCLOSE(HANDLE2)
RETURN


以上如果要轉載請注明出處.

待續...




相关文章

相关软件