用VB定制口令登錄控件

發表于:2007-07-14來源:作者:點擊數: 標簽:
福州市鰲峰路118號福州人造板廠 張和據 大家知道,為防止非授權人隨意運行軟件,可以在該軟件中設置密碼而達到保護軟件不被隨意運行的目的。如果直接在軟件中設置密碼,至少存在兩點不足:1、密碼容易被PCTOOLS之類的工具軟件窺視到;2、給普通用戶修改密碼
福州市鰲峰路118號福州人造板廠 張和據

大家知道,為防止非授權人隨意運行軟件,可以在該軟件中設置密碼而達到保護軟件不被隨意運行的目的。如果直接在軟件中設置密碼,至少存在兩點不足:1、密碼容易被PCTOOLS之類的工具軟件窺視到;2、給普通用戶修改密碼帶來困難。為此,筆者用VB5.0制作口令登錄ACTIVEX控件PASSWORD.OCX,該控件將口令加密后以文件的形式保存,工具軟件無法看到密碼,而用戶修改口令卻很方便。筆者認為雖然自編的口令登錄控件在加密算法方面比較簡單,但因其不象專業加密軟件那樣廣泛應用,不至于引起眾多的解密者挖空心思對其解密,反而更安全。當你用兼容ACTIVEX控件的語言編寫應用軟件時,只需將PASSWORD.OCX控件加入你的軟件之中,就可使應用軟件具有口令登錄的功能。
該控件將口令加密后以文件的形式儲存在WINDOWS目錄下。加密方法為:產生隨機數與每個口令字符的ASCII碼異或,再乘以該隨機數后儲存.并將隨機數和口令長度加密后保存。該控件的具體制作過程如下:
1、設計控件外觀。運行VB,選擇新建ACTIVEX控件,制作如圖1所示的登錄窗體,把工程名稱改為PASSWORD。

2、設置控件屬性、方法。在VB菜單的外接程序里找到ACTIVEX控件向導,按照向導提示逐步完成。具體過程為:在選定界面成員窗體步驟中選中TIMER事件,在創建自定義界面成員步驟中定義OPENPASWD方法及GETLOGONINFO屬性(獲取登錄成功與否的信息)、GETCOUNTFT屬性(獲取輸入口令次數的信息)和PRESS事件。在設置映射步驟中將TIMER事件映射到控件TIMER1,成員TIMER之中。在設置屬性步驟中,將GETCOUNTFT及GETLOGONINFO屬性數據類型設置為BOOLEAN,缺省值為0 。至此,ACTIVEX控件向導設置完成。
3、在控件中添加模塊MODULE1,并在代碼中加入如下申明:
DECLARE FUNCTION GETWINDOWSDIRECTORY LIB "KERNEL32" ALIAS "GETWINDOWSDIRECTORYA" _
(BYVAL LPBUFFER AS STRING, BYVAL NSIZE AS LONG) AS LONG 注釋:獲取WINDOWS目錄
4、編寫控件代碼,完成口令登錄、口令修改功能,其代碼如程序1所示。
5、編譯PASSWORD.OCX控件。
口令登錄控件編譯完成之后,可以把它加入工具箱中,供應用程序使用。當我們把應用軟件提供給用戶時,可以通過安裝程序把初始口令裝在WINDOWS目錄下,安裝程序的創建可參考有關書籍。
為了演示該控件,先將初始口令為123的口令文件TST.DAT拷貝到WINDOWS目錄下,在VB中建立標準的EXE工程,將PASSWORD.OCX控件添加到工具箱中,制作如圖2所示的窗體,編寫如程序2所示代碼,編譯后運行,輸入123便進入登錄成功的FORM2窗體中,如果輸入三次口令均不對則程序終止。在實際應用中FORM2窗體就應該是我們應用軟件在口令登錄成功后下一步需要作的內容。


本控件程序在WINDOWS ME、WINDOWS98,VB5.0環境下,調試運行通過。
TST.DAT的內容為:"DON注釋:T MODIFY THESE DATA",191165,438555,126258860,126292595,126281350,3733101,3699366,3665631,3631896,3598161,3564426,3530691,3496956,


程序1 (口令控件代碼)
DIM PSW AS STRING
DIM PASOK AS BOOLEAN
DIM PASNEW AS STRING
DIM PASFIRST AS STRING
DIM PASNUM AS BOOLEAN
DIM LENG AS LONG
DIM PASOLD AS STRING
DIM FLAG AS STRING
DIM FIRST AS INTEGER
DIM LP AS LONG
DIM LPP AS LONG
DIM GETINFO AS BOOLEAN
DIM GETCOUNT AS BOOLEAN
DIM WINDIR AS STRING
DIM WINDIRLEN AS LONG
DIM WINDIRS AS STRING
PUBLIC EVENT PRESS()
注釋:EVENT DECLARATIONS:
EVENT TIMER() 注釋:MAPPINGINFO=TIMER1,TIMER1,-1,TIMER
PRIVATE SUB COMMAND1_CLICK() 注釋:如果口令正確就登錄
STATIC LOOPNUM AS INTEGER
LOOPNUM = LOOPNUM + 1
IF LOOPNUM > 2 THEN GETCOUNT = FALSE 注釋:判斷輸入口令次數是否超過3次
PSW = "NO"
PASOLD = TEXT1.TEXT

CALL OPENPASWD

IF LENG <> LEN(TEXT1.TEXT) THEN PSW = "NO" 注釋:判斷輸入口令是否與原口令長度相等
IF STRCOMP(PSW, "NO") = 0 THEN
LABEL2.CAPTION = "口令錯,請重新輸入!"
TEXT1.TEXT = ""
TEXT1.SETFOCUS
ELSE:
GETINFO = TRUE 注釋:口令正確

END IF
RAISEEVENT PRESS
END SUB
PUBLIC SUB OPENPASWD() 注釋:打開口令文件
T = 0
ON ERROR RESUME NEXT 注釋: 將錯誤處理的方式改為"繼續下一行"。
OPEN WINDIRS & "\TST.DAT" FOR INPUT AS #1 注釋:讀取口令密文
IF ERR.NUMBER <> 0 THEN
P = MSGBOX("口令已被破壞無法運行", 16, "退出應用軟件")
ERR.CLEAR
GETCOUNT = FALSE
END IF
INPUT #1, INFO, NUM, LENG
NUM = NUM / 17
LENG = (LENG / NUM) / 13 注釋:解密口令長度及口令
DO WHILE T <= LENG - 1
T = T + 1
INPUT #1, CHR1
LP = CHR1 / NUM
LPP = LP XOR NUM
PASS = CHR(LPP)
IF STRCOMP(PASS, RIGHT(LEFT(PASOLD, T), 1)) <> 0 THEN
PSW = "NO"
ELSE: PSW = "YES"
END IF
LOOP
CLOSE
END SUB

PRIVATE SUB COMMAND2_CLICK() 注釋:如果輸入正確的原口令就更改口令
INFO = "DON注釋:T MODIFY THESE DATA"
IF PSW = "YES" THEN
PASNUM = TRUE
PASNEW = TEXT2.TEXT
IF STRCOMP(PASFIRST, PASNEW) = 0 THEN PASOK = TRUE

IF PASOK = TRUE THEN
T = 0
OPEN WINDIRS & "\TST.DAT" FOR OUTPUT AS #1 注釋:將口令文件創建在WINDOWS目錄下
SAV = PASNEW
RANDOMIZE
NUM = INT(10000 * RND(20)) + 1 + INT(RND(60) * 10000) 注釋:隨機數
KK = LEN(SAV)
WRITE #1, INFO, NUM * 17, KK * NUM * 13, 注釋:將隨機數及變換后的口令長度寫入文件
DO WHILE T <= KK - 1 注釋:加密口令
T = T + 1
CHRQ = LEFT(SAV, T)
CHR1 = RIGHT(CHRQ, 1)
LP = ASC(CHR1) XOR NUM
LPP = LP * NUM
WRITE #1, LPP,
LOOP
IF KK < 10 THEN 注釋:如果口令長度少于10個字符,繼續寫入字符,防止解密者猜測口令長度
LL = 10 - KK
DO WHILE LL >= 0
WRITE #1, NUM * KK * (LL + 100) + 123456,
LL = LL - 1
LOOP
END IF
CLOSE

LABEL2.FORECOLOR = QBCOLOR(3)
LABEL2.CAPTION = "口令更改成功!"
TIMER1.ENABLED = TRUE
END IF

IF PASNUM = TRUE AND PASOK = FALSE THEN 注釋:允許有三次確認新口令的機會
LABEL2.FORECOLOR = QBCOLOR(13)
LABEL2.CAPTION = "請再輸入一次新口令!"
FIRST = FIRST + 1
IF FIRST = 1 THEN PASFIRST = PASNEW
IF FIRST > 3 THEN GETCOUNT = FALSE
TEXT2.TEXT = ""
TEXT2.SETFOCUS
END IF

ELSE:
STATIC LOOPNUM AS INTEGER 注釋:有三次機會輸入原口令
LOOPNUM = LOOPNUM + 1
IF LOOPNUM > 2 THEN GETCOUNT = FALSE
PASOLD = TEXT2.TEXT
CALL OPENPASWD
IF LENG <> LEN(PASOLD) THEN PSW = "NO"
IF STRCOMP(PSW, "NO") = 0 THEN
LABEL2.FORECOLOR = QBCOLOR(12)
LABEL2.CAPTION = "口令錯,請重新輸入!"
TEXT2.TEXT = ""
TEXT2.SETFOCUS
END IF

IF STRCOMP(PSW, "YES") = 0 THEN
LABEL2.FORECOLOR = QBCOLOR(4)
LABEL2.CAPTION = "請輸入新口令!"
TEXT2.TEXT = ""
TEXT2.SETFOCUS
PASNUM = TRUE
END IF
END IF
RAISEEVENT PRESS
END SUB


PRIVATE SUB OPTION1_CLICK() 注釋:更改口令
TEXT2.SETFOCUS
LABEL2.CAPTION = "請輸入原口令!"
RAISEEVENT PRESS
END SUB

PRIVATE SUB TIMER1_TIMER() 注釋:延時2秒關閉登錄窗口
GETCOUNT = FALSE
RAISEEVENT TIMER
END SUB
PUBLIC PROPERTY GET GETLOGONINFO() AS BOOLEAN
GETLOGONINFO = GETINFO
END PROPERTY

PRIVATE SUB USERCONTROL_INITIALIZE()
WINDIR = STRING(255, 0)
WINDIRLEN = GETWINDOWSDIRECTORY(WINDIR, 255)
WINDIRS = LEFT(WINDIR, WINDIRLEN)
PSW = "NO"
TIMER1.INTERVAL = 2000
LOOPNUM = 0
TIMER1.ENABLED = FALSE
PASNUM = FALSE
PASOK = FALSE
FIRST = 0
GETINFO = FALSE
GETCOUNT = TRUE
END SUB

PUBLIC PROPERTY GET GETCOUNTFT() AS BOOLEAN
GETCOUNTFT = GETCOUNT
END PROPERTY

程序2:(演示程序)
PRIVATE SUB USERCONTROL11_PRESS()
IF USERCONTROL11.GETLOGONINFO = TRUE THEN
UNLOAD FORM1
FORM2.SHOW
END IF
IF USERCONTROL11.GETCOUNTFT = FALSE THEN
UNLOAD FORM1
END IF
END SUB

PRIVATE SUB USERCONTROL11_TIMER()
IF USERCONTROL11.GETCOUNTFT = FALSE THEN

UNLOAD FORM1
END IF
END SUB

原文轉自:http://www.anti-gravitydesign.com

国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97