2017-06-01 88 views
0

當用戶更改數據時,我需要更新C#應用程序中的DataTable中的字段。在更新文本框時更新DataTable中的字段

DataTable是一個內存數據表 - 我將任何數據保存並加載到一個XML文件(writeXML方法)中,所以沒有底層數據庫。 我正在使用它來保存一些關於登錄的信息,因此我有一個我想要加密的密碼字段。這一點很重要,因爲當我運行保存到XML時,它會將密碼寫出未加密的密碼。

我正在看着做這兩種不同的方式,並希望得到一些反饋。

  1. 從XML加載,然後解密每一行中的所有密碼值,並在保存到XML之前加密它們。我可以使用類似的東西:

    foreach (DataRow row in tmp.Rows) 
    { 
        row["PW"] = EncryptIt(row["PW"].ToString()); 
    } 
    

    但是,這似乎有點不安全。它會給我一個內存中的密碼解密的數據表。但我認爲沒有什麼比使用時一次只解密一個密碼...

  2. 保持內存數據表中的密碼被加密。但是,當用戶使用屏幕編輯記錄時,我可以在用戶輸入文本框後對輸入的值進行加密。我可以隨時解密來自DataTable的值,只要我需要使用它。這將保持密碼在DataTable中的加密,但是當我需要使用它們時,我將不得不解密它們,所以我不確定它是否比上面更簡單的方法更安全。

你對方法1和方法2有什麼看法?

上面的方法#2還介紹了一些關於如何最好地加密數據的附加問題 - 我的意思是使用什麼事件?

我一直在玩EditValueChangedTextChanged,但是他們似乎都在爲每一個被改變的角色開火。我還需要考慮各種情況,例如離開現場,並且在用戶更改字段然後在不離開字段的情況下點擊保存按鈕的情況下不離開現場。

當用戶將數據綁定的TextBox更改爲該字段(通過綁定源)時,如何更新基礎DataTable字段?

我開始認爲選項一會更易於實施,並且在安全性方面不會更差。或者我錯過了什麼?

+1

不是你的問題的答案,但如果你是新來存儲密碼,你應該肯定給[這個](https://security.stackexchange.com/questions/6068/is-it-possible-to-securely -store-passwords-using-reversible-encryption)和[this](http://security.blogoverflow.com/2013/09/about-secure-password-hashing/)讀取。 – marcushobson

回答

0

如果你關心的是記憶中的明文,你建議我會選擇第二種方法。 您也可以考慮散列數據庫中的密碼。哈希是一種單向加密,您總是比較「加密」結果,並且無法檢索原始密碼。

有關於散列

廣告的第二部分,當用戶點擊保存按鈕,編輯字段失去首先關注的好文章here,因此,如果您訂閱了文本框的leave事件中,你應該是安全的。

+0

Henrik,您好,感謝您的快速回復。你對離開事件是正確的......現在我想到了 - 這是顯而易見的:) – user7003495

0

我打算髮表評論,但我覺得最好回覆,因爲我發送了一些示例代碼。

一個更好的處理密碼存儲的方法是生成一個salt,然後使用它來散列密碼,然後將salt和散列傳遞存儲在數據庫中。當用戶登錄時,你會得到salt,用它對輸入進行散列,然後與數據庫中的散列進行比較。

public static string CreateSalt(int size) 
    { 
     // Generate a cryptographic random number using the cryptographic 
     // service provider 
     RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider(); 
     byte[] buff = new byte[size]; 
     rng.GetBytes(buff); 
     // Return a Base64 string representation of the random number 
     return Convert.ToBase64String(buff); 
    } 

    public static string CreatePasswordHash(string pwd, string salt) 
    { 
     string saltAndPwd = String.Concat(pwd, salt); 
     string hashedPwd = 
       FormsAuthentication.HashPasswordForStoringInConfigFile(
                saltAndPwd, "SHA1"); 
     hashedPwd = String.Concat(hashedPwd, salt); 
     return hashedPwd; 
    } 

這些是你需要的兩個助手。 要創建哈希密碼(新用戶),你做這樣的事情:

var salt = CreateSalt(24); 
var passHash = CreatePasswordHash(password, salt); 

同樣,存儲在數據庫中的鹽和散列通。

檢查登錄時,詢問數據庫中的鹽和散列通行證。 像以前一樣對密碼進行哈希處理,然後與散列通過比較。

更好的是,更安全的是,在數據庫中創建一個存儲過程,如果散列過程與表中的散列過程相同,那麼散列過程永遠不會下載到客戶端,只有鹽。

應該指出雖然,根據https://msdn.microsoft.com/en-us/library/system.web.security.formsauthentication.hashpasswordforstoringinconfigfile(v=vs.110).aspxFormsAuthentication.HashPasswordForStoringInConfigFile方法已過時,你應該看看http://go.microsoft.com/fwlink/?LinkId=252463然而,我沒有示例代碼,你有(我能想到的...)。當然,如果你使用的是桌面/ windows窗體應用程序,那對你無能爲力,但要點:

使用salt哈希密碼。 永不解密存儲的密碼。