全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:874
推到 Plurk!
推到 Facebook!

讓密碼更安全

 
delphi
初階會員


發表:52
回覆:64
積分:38
註冊:2002-05-21

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-05-14 17:14:45 IP:61.63.xxx.xxx 未訂閱
讓密碼更安全 ---- 隨著應用軟件的日益豐富,需要使用密碼的地方也越來越多,尤其是對於上網的人來說,密碼幾乎無處不在。然而在當前各種應用軟件中普遍存在密碼的安全問題,其原因在於各種開發工具中編輯框存在安全漏洞。密碼輸入顯示是需要保密的,所以用來做輸入和顯示的編輯框可以設置passwordchar,這時候編輯框就會只顯示『*』之類的字符,而將真正的文本隱藏起來。這樣似乎文本就無法看到了,然而事實上這樣的保護是非常脆弱的,有很多辦法可以突破這層保護,最簡單的辦法就是使用SendMessage向編輯框傳送一個EM_SETPASSWRODCHAR消息,將Passwordchar設置為0,就可以讓密碼原形畢露,而且windows並沒有對設置了passwordchar的編輯框文本讀取進行保護,所以也可以編程直接讀出密碼文本。實際上現在已經有了不少這樣的軟件,還記得Revelation嗎,一個15k的小程序卻使得微軟不得不出面解釋,所以對於重要的密碼還是再來加上一層保護吧。 ---- 由於各種開發工具實際上都在使用Windows系統編輯框,所以從VC、VB到BC、Delphi等無一倖免,如何在自己的程序中避免這種情況呢,一個簡單的辦法就是子類化(subclassing),也就是使用自定義的編輯框WindowProc來進行消息處理,對於passwordchar的設置和文本讀取消息(分別是WM_GETTEXT 和EM_SETPASSWORDCHAR))進行檢查,把那些非法操作過濾掉。對於VC來說是非常簡單的,可以從CEdit直接派生一個安全的新類CPwdEdit:首先用ClassWizard生成新類,然後加入共有變量BOOL m_bLock,並重載WndProc(),修改下面兩個成員函數: CPwdEdit::CPwdEdit() { m_bLock=FALSE; } LRESULT CPwdEdit::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) { // TODO: Add your specialized code here and/or call the base class //在這裡加入消息檢查 if( m_bLock && (message==WM_GETTEXT || message==EM_SETPASSWORDCHAR) ) return 0; ---- //對於EM_SETPASSWORDCHAR,wParam是緩衝區大小,lParam是緩衝區地址,所以在這裡可以向緩衝區拷貝一個設定的字符串來迷惑讀取程序。 //其他消息調用缺省窗口函數 return CEdit::WindowProc(message, wParam, lParam); } ---- 使用時,只需要設置m_bLock=TRUE就可以阻止revelation的讀取了。假定在對話框MyDlg中有一個編輯框IDC_EIDT1,用法如下: CPwdEdit m_edit1; BOOL CMyDlg::OnInitDialog() { 。。。 // TODO: Add extra initialization here m_edit1.SubclassDlgItem( IDC_EDIT1,this ); m_edit1.SetPasswordChar( '*' ); m_edit1.SetWindowText( "12345" ); m_edit1.m_bLock=TRUE; 。。。 } ---- 直接使用SDK就稍微複雜一些,需要手工進行子類化,設定一個對話框應用,加入如下代碼: HWND hwndEdit; BOOL bLock=FALSE; #ifdef STRICT WNDPROC OldEditProc; #else FARPROC OldEditProc; #endif //自定義窗口函數 LRESULT CALLBACK MyEidtProc ( HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam ) { LRESULT lResult=0; if( bLock && (uMsg==WM_GETTEXT || uMsg==EM_SETPASSWORDCHAR) ) return lResult; //下面調用原窗口函數 if( (DWORD)OldEditProc!=(DWORD)MyEidtProc ) lResult=CallWindowProc(OldEditProc, hwnd,uMsg,wParam,lParam); return lResult; } //在對話框中進行子類化 BOOL WINAPI DlgProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { //在初始化代碼中進行子類化 case WM_INITDIALOG: //得到編輯框句柄 hwndEdit=GetDlgItem( hwnd, IDC_ EDIT1 ); //得到原窗口函數地址 OldEditProc = GetWindowLong( hwndEdit,GWL_WNDPROC ); //設置自定義窗口函數 SetWindowLong( hwndEdit, GWL_WNDPROC, (DWORD)MyEidtProc ); bLock=TRUE; break; 。。。 } } ---- 經過測試,以上的方法可以成功地阻止Relevation1.1和其他軟件竊取密碼,不過由於這個漏洞實際上出自Windows系統本身,所以在編寫軟件時還是要注意這個問題,盡量避免密碼的直接顯示。 逃避不一定躲得過 面對不一定最難受 孤單不一定不快樂 得到不一定能長久 失去不一定不再有 轉身不一定最軟弱
系統時間:2024-05-13 23:36:52
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!