我有一个将加密文件存储到磁盘的Windows窗体应用程序。在运行时,它会解密这些文件并将生成的内存流传递给数据集。我正在使用AESManaged进行对称加密。
有一些自定义函数可以从字符串生成Key和IV字节数组。但是我目前正在编写用于生成Key和Iv的安全字符串,我认为这会破坏加密的目的。我知道最好的方法是提示用户输入密码并使用该字符串。有没有其他方法可以提示用户输入密码?此外,我无法使用DPAPI,因为加密数据文件应该在用户和计算机之间共享。
答案 0 :(得分:2)
你的蛋糕也不可能吃掉它:)你不能存储解密密钥并使用它,也不能被某人恢复。你唯一能做的就是通过混淆你的代码,预先加密你的密钥并动态解密它,或者通过分散在几个类周围的几轮解密来明确它的位置。与其他编程规则不同,这就是凌乱的代码是一件好事。
答案 1 :(得分:1)
我认为你还应该考虑DPAPI;不是用于加密数据文件,而是用于加密秘密字符串。
是否可以让您的用户只输入一次秘密字符串?*如果可以,您可以:
由于您的数据文件仍将由具有相同密码字符串的AES加密,因此它们仍可以互换。 (在具有相同秘密字符串的人中...所以现在你刚刚创建了它,所以你的应用程序可以有多个安全组,每个组都设置自己的秘密......但这是一个切线。)
优势在于,即使有人获得了您的代码,也没有任何逆向工程会回馈秘密字符串。因为它不在那里。
请注意,这比单独使用混淆更好。通过混淆,如果攻击者获取了您的代码并且可以在他们自己的环境中运行它们,他们可以附加调试器,并在您将字符串传递给AES代码时停止。他们不必关心你用多少技巧来争夺它。他们只是在你解读它之后才看它。使用DPAPI,除非他们在用户的上下文中运行您的代码,否则这将无效。在这种情况下,无论如何都是游戏。
我不是说DPAPI是完美的,但在这种情况下,我会在单独使用混淆之前考虑它。 (您仍然可以通过混淆工具运行代码:也是一件好事,但还不够。)
*如果没有,您可以在安装/初始配置时提供吗?我在一个文件中看到了一些用明文密钥安装的地方,然后程序在第一次使用时加密它。