根据"密码"加密对象字典键入C#WinForms

时间:2016-12-09 04:21:44

标签: c# winforms dictionary encryption

我正在使用C#WinForms应用程序,该应用程序从用户获取信息,如姓名,电子邮件,帐单地址,信用卡等。每组所有信息都存储在帐单帐户对象(帐单)中。我将所有对象存储在字典中,并且工作正常。

现在我完成了这项工作,我希望它能够保存结算帐户字典,这样如果程序关闭并再次打开,他们的帐户仍然会存在。我也需要加密信息,因为它包含信用卡等敏感信息。有没有办法根据"密码加密和保存字典"键,以便以后可以访问?任何帮助将非常感激。非常感谢!

编辑:只是想明确我只在用户计算机上存储信息。它离开的唯一时间是通过https连接,与登录在线商店并在那里输入它无异。

编辑2:信息仅存储在用户的计算机上,其中具有操作系统安全性的所有防御。我只想保护并隐藏它,以便给它一点额外的安全性,并且还可以阻止任何人点击文本文件并使信息显而易见。

2 个答案:

答案 0 :(得分:0)

我会将这个问题分解为两个不同的部分:

1。如何安全存储用户密码:

这是一个相当复杂的话题,但有很多关于它的文章......这是基本的想法。

  • 不要存储密码。而是存储由您生成的哈希 密码哈希算法,一个适当复杂的盐和(取决于 您的哈希算法)存储用于Key Stretching的数字。
  • 使用用户提供的密码尝试重新计算密码 使用存储的盐和拉伸数进行哈希。
  • 如果哈希匹配您存储的内容..那么密码是正确的! hooray,您现在可以将该密码用作加密密钥的一部分。

Some reading material

2。将该密码用作盐以生成加密密钥:

老实说,我以前不太了解这个,因为我以前依赖数据库级加密。

也许有人可以填写更多相关信息?

这是MSDN article on generating encryption keys

答案 1 :(得分:0)

基本上你想要做的是以加密形式存储信息,基于密码...

首先是一些旁注:

  • 无论你的加密有多安全,它总会像链条中最薄弱的环节一样脆弱...如果你的用户有123作为密码,那么......¯\ _(ツ)_ /¯

  • 不要滚动你自己的加密......你会搞砸...使用标准库和众所周知的算法

所以从哪里开始...

你有一些密码(pw)和一些明文信息,它们将表示为字节数组(数据)

现在找到一个包含PBKDF2的库( P assword B ased K ey D erivation F 取消 2

对于c#很可能是Rfc2898DeriveBytes - mscorelib的System.Security.Cryptography

中的类

如果你可以提供一个机器和用户相关的盐,并使用一个迭代计数(c),在目标平台上花费大约一秒钟来完成(你将不得不尝试迭代计数...更高=更好但更慢......这个值越高,攻击者试图尝试密码的计算成本就越高......我很确定你可以承受一两秒钟的延迟输入密码......对于攻击者而言,这意味着每秒不再尝试数百万个密码,只需要几个,或者他需要大量的计算单位)... 提示提示提示:c可能是你想要的变量放入.config文件以便更改,具体取决于运行程序的机器...但请注意:在首次使用密钥后更改此密码并且您的数据非常垃圾

那么PBKDF2的结果是什么? ...一个字节数组,它将是我们的密钥(k)

所以...... k = PBKDF2(pw,s,c)

从技术上讲,提到的c#类希望你用参数调用它的构造函数,然后在结果对象上调用GetBytes(Int32),从PBKDF2中提供你想要多少个 bytes ...

那么k有多大? ...取决于您的密码......例如,AES-256需要256个密钥位,这是一个不太可能很快被强制执行的密钥...这意味着您需要256/8 = 32个密钥字节

所以现在我们有一个加密有用的密钥k

现在可以使用密码来使用它,例如说AES-256 ......

对于c#,一个例子是System.Core的System.Security.Cryptography.AesCryptoServiceProvider

创建一个实例,提供k作为密钥,现在对于该类的标准操作模式(CBC,密码块链接),提供随机IV(初始化向量,只有一个块长度,128位/ 16byte)案例,随机数据,不是秘密,可以安全地与您的密文一起存储)

可以在msdn示例代码... https://msdn.microsoft.com/en-US/en-en/library/system.security.cryptography.aescryptoserviceprovider(v=vs.110).aspx

中查看所描述的类的安全用法

请记住,您需要使用相同的IV进行解密,因此您需要保存...而不是......不要对值进行硬编码