首先建立兩個數據庫(table),一個用來存放口令及對應的用戶名(稱為“口令庫”),另一個存放用戶登錄使用情況(稱為“登錄庫”)。再建立兩個窗口(form),一個用來檢查口令,另一個用來修改口令。接下來定義兩個過程(procedure),一個用來給口令加密(“加密過程”),另一個用給口令解密(“解密過程”)。“加密過程”是把密碼經加密運算後存入口令庫,“解密過程”實際上是把輸入的密碼經加密運算後與口令庫內的密碼進行比較,並不解密。為了使密碼輸入時不被看見,密碼輸入時顯示隱性文字。“解密過程”基本代碼如下:
parameter password
pas=“”
n1=asc(substr(name,1,1)) &&取姓名的第一個拚音字母,換算成ASCII碼
n2=asc(substr(name,2,1)) &&作為加密的鍵值
n3=asc(substr(name,3,1))
n=int((n1+n2+n3)/3)
for i=1 to len(trim(password)) &&使用BITXOR()函數對密碼進行解密
tempchr=bitxor(asc(substr(password,i,1)),n)
pas=pas+chr(tempchr)
endfor
locate for klk.user_id=name&&與口令庫內的與姓名相對應的口令進行比較
if (klk.key
pas) and (password
“hg”)
result=.f.
else
result=.t.
endif
return result
bitxor ()函數是vfp特有的函數,它將函數的兩個參數轉換成二進製數,並且執行“與”操作,返回一個十進製的結果。加上密碼鍵值n(此處是取姓名的第一個拚音字母,經求和,再取平均值,再取整運算,換算成ASCII碼),得到每人一個的密碼。加密過程是解密過程的逆運算,基本代碼如下:
parameter password
pas=“”
for i=1 to len(trim(password))
n1=asc(substr(name,1,1))
n2=asc(substr(name,2,1))
n3=asc(substr(name,3,1))
n=int((n1+n2+n3)/3)
tempchr=bitxor(asc(substr(password,i,1)),n)
pas=pas+chr(tempchr)
endfor
replace key with pas
檢查密碼的思路是:先到輸入姓名的文字框內取姓名,再到口令庫內查找姓名,如果找不到姓名,返回消息窗口“您不是指定用戶,請與係統管理員聯係!”,係統退出;如果找到了用戶姓名,則繼續進行。把輸入的口令和姓名送到“解密過程”中進行運算,“解密過程”將其解密,並與口令庫內的數據進行比較,如果不正確,開始計數,要求重新輸入密碼,三次不正確,退出係統。如果正確,釋放當前窗口,進入係統。主要代碼如下:
name=trim(ThisForm.Text1.value)
if empty(name)
a=messagebox(“請輸入用戶名!”,0+48,“信息窗口”)
ThisForm.Text1.setfocus