2011-09-01 47 views
2

基本上我試圖創建一個程序,它需要有一些授權。使用Access存儲用戶名和密碼並通過Visual Basic打開

當應用程序啓動時,它直接進入登錄屏幕。

我想要用戶名和密碼文本框來讀取數據庫,如果他們匹配,然後進展到下一個表單,但如果他們不匹配,則會出現一個消息框。

我也想創建一羣人,所以如果某個人羣登錄,他們會轉到某個表單,如果另一個人登錄,我希望他們轉到另一個表單。

另外我想密碼框爲*而不是可見文本。

任何一個可以幫助,這是我到目前爲止的代碼...

dbProvider = 「PROVIDER = Microsoft.Jet.OLEDB.4.0;」 dbSource =「數據源= d:/Users.mdb」

con.ConnectionString = dbProvider & dbSource 

    con.Open() 


    sql = "SELECT * FROM tblUsers" 
    da = New OleDb.OleDbDataAdapter(sql, con) 
    da.Fill(ds, "Users") 

    con.Close() 

    MaxRows = ds.Tables("Users").Rows.Count 
    inc = -1 


    If UserIDTextBox.Text = ds.Tables("tblUsers").Rows(0).Item("UserID") & User_PasswordTextBox.Text = ds.Tables("tblUsers").Rows(0).Item("Password") Then 
     MsgBox("This have worked correctly!") 
    Else 
     MsgBox("This has not worked, try again!") 
    End If 
+0

NEVER NEVER NEVER ** **存儲密碼的數據庫或其他地方。您需要加密_hash_密碼並僅存儲散列結果。 –

+0

好的......你怎麼做到的? –

回答

3

你需要知道的第一個也是最重要的一點是,它幾乎總是一個壞主意,編寫自己的身份驗證系統。這很容易做到這一點,似乎是正確的,甚至通過所有的測試,但仍然有微妙,難以發現的錯誤,直到一年後,當你發現你被破解六幾個月前。始終儘可能地傾斜您的平臺提供給您的任何身份驗證功能。

您需要知道的下一件事是您不在數據庫中存儲密碼。永遠。處理密碼匹配的正確方法是使用salt以一種簡單的方式更改原始密碼,以便簡單的字典密碼現在不會再導致可以通過谷歌查找輕鬆取消的值,然後使用加密哈希像bcrypt,scrypt或(如果你真的必須)sha1算法。不要使用md5。這方面的例子很容易在谷歌上得到,並且會比我在這裏解釋得更好。當有人想要登錄時,您對他們嘗試的密碼執行相同的步驟,現在只比較哈希值。如果你沒有這樣做,你的用戶的密碼成爲公衆所知只是時間問題。

接下來我發現你的代碼中的數據庫連接處理有問題。您擁有的代碼不能保證關閉連接。 con.Close()應該總是位於Finally塊中,對於首選項,我喜歡Using塊速記。

最後,接近底部的方法是嘗試使用VB的字符串拼接運算符(&)作爲邏輯AND。哎呀。您想在此處使用AndAlso運算符。

+0

好的, 你有什麼鏈接,我可以學習如何在bcrypt或scrypt中編碼?或我可以審查的任何代碼? –

+0

http://bcrypt.codeplex.com/ –

0

山姆,

的我第一第二什麼喬爾說,哈希密碼。這裏有一個鏈接:What is the easiest way to encrypt a password when I save it to the registry?

至於TextBox,只需將PasswordChar屬性設置爲*,它將掩蓋字符。你也可以限制長度。

至於只允許某些組,如果你在Windows域中,你應該使用活動目錄組。要確定是有人一組的成員,你可以這樣做:

def IsMemberOfAdGroup(grouName as string): 
    windID = System.Security.PrincipalWindowsIdentity.GetCurrent() 
    return System.Security.PrincipalWindowsPrincipal(windID).IsInRole(grouName) 
相關問題