在應(yīng)用系統(tǒng)中,經(jīng)常使用口令實(shí)現(xiàn)對(duì)系統(tǒng)操作權(quán)限的控制,常規(guī)的方法是在進(jìn)入系統(tǒng)時(shí)提示操作者輸入一個(gè)字符串口令。這種口令的設(shè)置方法多種多樣,有的是將固定口令密碼寫在程序里,系統(tǒng)開始要求操作者輸入該密碼,正確方可進(jìn)入,這種方法的缺點(diǎn)是密碼不能改變,且全系統(tǒng)只有一個(gè)。還有一種方法是將操作者輸入的密碼通過加密,轉(zhuǎn)換為加密偽碼存儲(chǔ)在數(shù)據(jù)庫中,但這種方法的密碼和偽碼仍有顯式的對(duì)應(yīng)關(guān)系,容易被*。本文介紹一種在VFP中用隨機(jī)偽碼存庫的方法實(shí)現(xiàn)簡單可靠的系統(tǒng)加密,并用此方法實(shí)現(xiàn)一個(gè)應(yīng)用系統(tǒng)的多用戶權(quán)限控制,這種方法的特點(diǎn)是實(shí)現(xiàn)簡單,加密可靠,不易*,可將一個(gè)1至7位的用戶密碼轉(zhuǎn)換為20位的隨機(jī)偽碼,且每次重新設(shè)定密碼時(shí)所產(chǎn)生的偽碼都不相同,通過變換生成的20位偽碼沒有任何規(guī)律性,即使從數(shù)據(jù)庫中擦除偽碼也無法進(jìn)入系統(tǒng),從而實(shí)現(xiàn)了可靠的密碼權(quán)限控制。
---- 一、可靠的隨機(jī)偽碼存庫
---- 從用戶密碼到存庫的隨機(jī)偽碼之間的變換由兩個(gè)函數(shù)完成,一個(gè)是加密函數(shù),一個(gè)是解密函數(shù)。加密函數(shù)的思想是對(duì)用戶密碼(真碼)進(jìn)行復(fù)雜化、隱蔽化處理,也就是將真碼淹沒在20位偽碼中,加密函數(shù)如下:
FUNC MAZH1
PARA ZMZ
ZMZ=VAL(ZMZ)
N1=RAND()*10^9
IF N1<=999999999
N1=N1+10^9
ENDI
N1=INT(N1)
C1=STR(N1+ZMZ)+STR(N1)
C2=SUBS(C1,5,20)+SUBS(C1,1,4)
P1=''
P2=''
FOR II=1 TO 10
P1=P1+SUBS(C2,2*II-1,1)
P2=P2+SUBS(C2,2*II,1)
ENDFOR
WMZ=P1+P2
RETU WMZ
---- 若真碼為:1234567,則偽碼為:64915302152868193982,無論真碼是一位還是相同多位,偽碼總是具有同樣的不確定性和復(fù)雜性,所以若想通過簡化真碼來分析偽碼是不可能的。
---- 解碼函數(shù)是將數(shù)據(jù)庫中存放的偽碼轉(zhuǎn)換成原用戶密碼,其代碼如下:
FUNC MAZH2
PARA WMZ
PP=''
FOR II=1 TO 10
PP=PP+SUBS(WMZ,II,1)+SUBS(WMZ,II+10,1)
ENDFOR
DD=SUBS(PP,17,4)+SUBS(PP,1,16)
M1=SUBS(DD,1,10)
M2=SUBS(DD,11,10)
ZMZ=INT(VAL(M1)-VAL(M2))
RETU ZMZ
---- 由于提交的系統(tǒng)全是編輯的,非法者是無法得到密碼轉(zhuǎn)換函數(shù)中的信息的,所以解密方法是不易被發(fā)現(xiàn)的。
---- 二、多用戶權(quán)限控制的實(shí)現(xiàn)
---- 對(duì)一個(gè)包含多種業(yè)務(wù)操作的應(yīng)用系統(tǒng),由于業(yè)務(wù)的要求,常需要限制不同操作者的業(yè)務(wù)操作范圍,在VFP中,可以建立一個(gè)權(quán)限數(shù)據(jù)表,表中 有多個(gè)字段,分別用于存儲(chǔ)了每個(gè)操作者的代號(hào)、姓名、口令以及是否可以操作業(yè)務(wù)模塊的偽標(biāo)識(shí)碼,見下表:
工號(hào) 姓名 系 統(tǒng) 口 令
業(yè)務(wù)1操作標(biāo)識(shí)碼 業(yè)務(wù)2操作標(biāo)識(shí)碼 …
01 劉君紅 71510714108669886598 75913
759130063600536 02817028179076390563 …
02 何晚平 17615822156435449957 8341
3834133074230642 56314563144262342423 …
03 劉棋東 16710714110199886591 044
18701188588160484 83413834133074230642 …
04 趙民 58613143131858393185 4611702
8171696390565 48710144103584210444 …
05 王雪菲 80614563147782342425 52412
171122488399485 53210299114872812320 …
… …
---- 系統(tǒng)的主表單上的多個(gè)業(yè)務(wù)模塊由多個(gè)按鈕來實(shí)現(xiàn)啟動(dòng),那么在系統(tǒng)主表單的[確定]按鈕的CLICK EVENT方法程序中添加一些判斷代碼,就可以實(shí)現(xiàn)系統(tǒng)的口令和操作權(quán)限控制。輸入工號(hào)和口令后,按[確定],CLICK EVENT中的代碼首先根據(jù)輸入的工號(hào),對(duì)權(quán)限數(shù)據(jù)表中對(duì)應(yīng)記錄的口令偽碼進(jìn)行解碼,得出的真碼與輸入口令一致放可進(jìn)入系統(tǒng),口令測試通過后,再通過對(duì)每個(gè)業(yè)務(wù)所對(duì)應(yīng)的偽標(biāo)識(shí)碼字段內(nèi)容進(jìn)行解碼,確定該業(yè)務(wù)模塊是否允許操作,進(jìn)而將該模塊的啟動(dòng)按鈕的ENABLED屬性設(shè)置為.T.或.F.。為了在系統(tǒng)一啟動(dòng)就打開權(quán)限數(shù)據(jù)表,要將權(quán)限表添加到主表單的數(shù)據(jù)環(huán)境中。主表單的一個(gè)按鈕可以啟動(dòng)“權(quán)限維護(hù)”表單,該表單可以完成對(duì)每個(gè)工號(hào)的口令和操作權(quán)限設(shè)置。一般只有系統(tǒng)管理員被賦予“權(quán)限維護(hù)”的權(quán)限,不同工號(hào)的操作員在進(jìn)入系統(tǒng)后可以自行修改自己的密碼,而管理員無法知道操作員的密碼,只能進(jìn)行擦除,這一點(diǎn)更加提高了操作員密碼的安全性。
---- 以上表單和程序在金長城PII/400機(jī)上用Visual Foxpro5.0調(diào)試通過
---- 一、可靠的隨機(jī)偽碼存庫
---- 從用戶密碼到存庫的隨機(jī)偽碼之間的變換由兩個(gè)函數(shù)完成,一個(gè)是加密函數(shù),一個(gè)是解密函數(shù)。加密函數(shù)的思想是對(duì)用戶密碼(真碼)進(jìn)行復(fù)雜化、隱蔽化處理,也就是將真碼淹沒在20位偽碼中,加密函數(shù)如下:
FUNC MAZH1
PARA ZMZ
ZMZ=VAL(ZMZ)
N1=RAND()*10^9
IF N1<=999999999
N1=N1+10^9
ENDI
N1=INT(N1)
C1=STR(N1+ZMZ)+STR(N1)
C2=SUBS(C1,5,20)+SUBS(C1,1,4)
P1=''
P2=''
FOR II=1 TO 10
P1=P1+SUBS(C2,2*II-1,1)
P2=P2+SUBS(C2,2*II,1)
ENDFOR
WMZ=P1+P2
RETU WMZ
---- 若真碼為:1234567,則偽碼為:64915302152868193982,無論真碼是一位還是相同多位,偽碼總是具有同樣的不確定性和復(fù)雜性,所以若想通過簡化真碼來分析偽碼是不可能的。
---- 解碼函數(shù)是將數(shù)據(jù)庫中存放的偽碼轉(zhuǎn)換成原用戶密碼,其代碼如下:
FUNC MAZH2
PARA WMZ
PP=''
FOR II=1 TO 10
PP=PP+SUBS(WMZ,II,1)+SUBS(WMZ,II+10,1)
ENDFOR
DD=SUBS(PP,17,4)+SUBS(PP,1,16)
M1=SUBS(DD,1,10)
M2=SUBS(DD,11,10)
ZMZ=INT(VAL(M1)-VAL(M2))
RETU ZMZ
---- 由于提交的系統(tǒng)全是編輯的,非法者是無法得到密碼轉(zhuǎn)換函數(shù)中的信息的,所以解密方法是不易被發(fā)現(xiàn)的。
---- 二、多用戶權(quán)限控制的實(shí)現(xiàn)
---- 對(duì)一個(gè)包含多種業(yè)務(wù)操作的應(yīng)用系統(tǒng),由于業(yè)務(wù)的要求,常需要限制不同操作者的業(yè)務(wù)操作范圍,在VFP中,可以建立一個(gè)權(quán)限數(shù)據(jù)表,表中 有多個(gè)字段,分別用于存儲(chǔ)了每個(gè)操作者的代號(hào)、姓名、口令以及是否可以操作業(yè)務(wù)模塊的偽標(biāo)識(shí)碼,見下表:
工號(hào) 姓名 系 統(tǒng) 口 令
業(yè)務(wù)1操作標(biāo)識(shí)碼 業(yè)務(wù)2操作標(biāo)識(shí)碼 …
01 劉君紅 71510714108669886598 75913
759130063600536 02817028179076390563 …
02 何晚平 17615822156435449957 8341
3834133074230642 56314563144262342423 …
03 劉棋東 16710714110199886591 044
18701188588160484 83413834133074230642 …
04 趙民 58613143131858393185 4611702
8171696390565 48710144103584210444 …
05 王雪菲 80614563147782342425 52412
171122488399485 53210299114872812320 …
… …
---- 系統(tǒng)的主表單上的多個(gè)業(yè)務(wù)模塊由多個(gè)按鈕來實(shí)現(xiàn)啟動(dòng),那么在系統(tǒng)主表單的[確定]按鈕的CLICK EVENT方法程序中添加一些判斷代碼,就可以實(shí)現(xiàn)系統(tǒng)的口令和操作權(quán)限控制。輸入工號(hào)和口令后,按[確定],CLICK EVENT中的代碼首先根據(jù)輸入的工號(hào),對(duì)權(quán)限數(shù)據(jù)表中對(duì)應(yīng)記錄的口令偽碼進(jìn)行解碼,得出的真碼與輸入口令一致放可進(jìn)入系統(tǒng),口令測試通過后,再通過對(duì)每個(gè)業(yè)務(wù)所對(duì)應(yīng)的偽標(biāo)識(shí)碼字段內(nèi)容進(jìn)行解碼,確定該業(yè)務(wù)模塊是否允許操作,進(jìn)而將該模塊的啟動(dòng)按鈕的ENABLED屬性設(shè)置為.T.或.F.。為了在系統(tǒng)一啟動(dòng)就打開權(quán)限數(shù)據(jù)表,要將權(quán)限表添加到主表單的數(shù)據(jù)環(huán)境中。主表單的一個(gè)按鈕可以啟動(dòng)“權(quán)限維護(hù)”表單,該表單可以完成對(duì)每個(gè)工號(hào)的口令和操作權(quán)限設(shè)置。一般只有系統(tǒng)管理員被賦予“權(quán)限維護(hù)”的權(quán)限,不同工號(hào)的操作員在進(jìn)入系統(tǒng)后可以自行修改自己的密碼,而管理員無法知道操作員的密碼,只能進(jìn)行擦除,這一點(diǎn)更加提高了操作員密碼的安全性。
---- 以上表單和程序在金長城PII/400機(jī)上用Visual Foxpro5.0調(diào)試通過

