我正在使用C#WinForms应用程序,该应用程序从用户获取信息,如姓名,电子邮件,帐单地址,信用卡等。每组所有信息都存储在帐单帐户对象(帐单)中。我将所有对象存储在字典中,并且工作正常。
现在我完成了这项工作,我希望它能够保存结算帐户字典,这样如果程序关闭并再次打开,他们的帐户仍然会存在。我也需要加密信息,因为它包含信用卡等敏感信息。有没有办法根据"密码加密和保存字典"键,以便以后可以访问?任何帮助将非常感激。非常感谢!
编辑:只是想明确我只在用户计算机上存储信息。它离开的唯一时间是通过https连接,与登录在线商店并在那里输入它无异。
编辑2:信息仅存储在用户的计算机上,其中具有操作系统安全性的所有防御。我只想保护并隐藏它,以便给它一点额外的安全性,并且还可以阻止任何人点击文本文件并使信息显而易见。
答案 0 :(得分:0)
我会将这个问题分解为两个不同的部分:
这是一个相当复杂的话题,但有很多关于它的文章......这是基本的想法。
老实说,我以前不太了解这个,因为我以前依赖数据库级加密。
也许有人可以填写更多相关信息?
答案 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进行解密,因此您需要保存...而不是......不要对值进行硬编码