在更新文本框时更新DataTable中的字段

问题描述:

当用户更改数据时,我需要更新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

如果你关心的是记忆中的明文,你建议我会选择第二种方法。 您也可以考虑散列数据库中的密码。哈希是一种单向加密,您总是比较“加密”结果,并且无法检索原始密码。

有关于散列

广告的第二部分,当用户点击保存按钮,编辑字段失去首先关注的好文章here,因此,如果您订阅了文本框的leave事件中,你应该是安全的。

+0

Henrik,您好,感谢您的快速回复。你对离开事件是正确的......现在我想到了 - 这是显而易见的:) – user7003495

我打算发表评论,但我觉得最好回复,因为我发送了一些示例代码。

一个更好的处理密码存储的方法是生成一个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哈希密码。 永不解密存储的密码。