• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
    • 軟件測試技術
    • 軟件測試博客
    • 軟件測試視頻
    • 開源軟件測試技術
    • 軟件測試論壇
    • 軟件測試沙龍
    • 軟件測試資料下載
    • 軟件測試雜志
    • 軟件測試人才招聘
      暫時沒有公告

    字號: | 推薦給好友 上一篇 | 下一篇

    用VB定制口令登錄控件

    發布: 2007-7-14 20:28 | 作者: 佚名    | 來源: 網絡轉載     | 查看: 47次 | 進入軟件測試論壇討論

    領測軟件測試網 福州市鰲峰路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.kjueaiud.com/


    關于領測軟件測試網 | 領測軟件測試網合作伙伴 | 廣告服務 | 投稿指南 | 聯系我們 | 網站地圖 | 友情鏈接
    版權所有(C) 2003-2010 TestAge(領測軟件測試網)|領測國際科技(北京)有限公司|軟件測試工程師培訓網 All Rights Reserved
    北京市海淀區中關村南大街9號北京理工科技大廈1402室 京ICP備10010545號-5
    技術支持和業務聯系:info@testage.com.cn 電話:010-51297073

    軟件測試 | 領測國際ISTQBISTQB官網TMMiTMMi認證國際軟件測試工程師認證領測軟件測試網

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>