2

我試圖編寫一個程序,用它可以登錄到遠程網站。對於一些擁有多個帳戶的人,我儘量使他們更容易,並將帳戶數據存儲在IsolatedStorage中。在我的密碼的當前狀態下,密碼只輸入到TextBox中,一旦存儲密碼轉換爲MD5哈希值。如何正確保存密碼

現在我想重構這適當的代碼,但我卡住了。

A PasswordBox通過PasswordBox.SecureStringPasswordBox.Password公開其數據。

所以我點擊保存按鈕時,我想

public void OnClick(...) 
{ 
    var password = passwordBox.Password; 
    // store it somehow (e.g. custom MD5 encryption) 

    var savePassword = passwordBox.SecureString; 
    // store this string somehow, but how? 
} 

這裏只要我把明文口令從我PasswordBoxvar password執行的東西,我的問題

  • ,是有什麼可見在記憶中?一些黑客能夠通過反射/調試使這個普通的值可見嗎?哪些代碼使這些字符串實際可見?我需要注意什麼?
  • 如何處理PasswordBoxSecureString

我有點不知所措,我不知道如何正確處理應用程序中的密碼的本質。

我不是懇求整個解決方案和運行代碼。如果有人能讓我開始,我會很高興。而且,我不想要企業解決方案。我只是尋找一個,這是易於實施,並儘可能節省我投入的努力。

+2

如果攻擊者可以運行調試器或對私有數據*使用反射,那麼他們已經擁有系統*。 – 2013-03-03 17:45:31

回答

1

你真的需要密碼是可逆的嗎?

一個更安全的方式來存儲它是鹽和散列它。

用戶:JOHN

密碼:(開始爲)myUserPassword667!

然後使用某種形式的數據庫中是唯一的代碼針對數據庫的用戶。讓我們說一個GUID。

現在你有abcd-1234-12-1212121ab作爲唯一標誌約翰

所以你現在有一個基礎的密碼(哈希前)

myUserPassword667!abcd-1234-12-1212121ab

現在,您可以用SHA或其他散列的一個哈希這算法在System.Security命名空間中。

現在,你內部有,您對哈希算法點鹽......(部分代碼只)

MySecretSaltWords559BC

然後存儲結果無論是作爲Base64編碼或在您的數據庫二進制文件。

Ab09l\311sas==(簡體)

下一次你在用戶登錄找到自己的數據庫記錄,你當你產生的帳戶,並連接到他們輸入的密碼是用你的唯一代碼。

使用相同的技術和二進制比較結果輸入的密碼,然後你不需要永遠存儲他們的密碼。如果哈希不匹配,則不具有相同的密碼。

+0

我不需要它是可逆的,這是它目前的工作方式。隨着你給出的答案,我唯一的問題是,如何從'PasswordBox'中正確地獲得簡單密碼?將密碼的普通值分配給變量不良練習?如何處理這個? – 2013-03-03 14:40:59

+0

我會說使用Encoding.UTF8.GetBytes(securestring)將這些添加到一個內存流,追加你的獨特器,然後喂入沙。然後,你可以Array.Clear從編碼的字節,你可以倒回你的記憶流和填充0之前處置(如果你想)或只是處置 – 2013-03-03 14:52:49