【问题标题】:How do I securely encrypt information stored on the user's hard drive?如何安全地加密存储在用户硬盘上的信息?
【发布时间】:2011-09-30 01:58:08
【问题描述】:
我正在编写一个 .Net WinForms 应用程序,我需要保存密码才能访问远程服务。我有一个将所有设置写入其中的 XML 文件。但是,我不想将纯文本密码写入 XML 配置文件。我考虑过使用AesCryptoServiceProvider 来加密信息。这个类需要一个密钥来加密数据,我假设我可以把它留在我程序的源代码中。然而,在我看来,这似乎只比以明文形式存储稍微好一点,因为对于我的程序的所有实例,密钥总是相同的。我可以在第一次启动程序时生成一个密钥,但是,哪里是存储它的好地方?我的一个想法是使用一个常量密钥,以及一个与密码一起存储的盐。这将为每个人的机器制作一个唯一的“密钥”,而不必将密钥公开存储。是否有一种标准方法可以将此类信息存储在用户的硬盘上?
【问题讨论】:
标签:
.net
security
encryption
【解决方案1】:
我想不出一个完美的解决方案,但你可以使用 DPAPI ...
这通常会阻止在另一个系统上解密文件,但不会最终保护数据,因为用户可以从您的程序中提取额外的密钥字节,并且因为他可以访问机器/用户密钥也是个问题……
如果您的问题更像是“在哪里存储无法避免的最终加密密钥?” ...我会为每个具有严格访问权限的用户建议一个注册表路径
【解决方案2】:
我能想到的只有两个选择
- 让用户使用主密码 - 这意味着用户全权负责加密数据。不过这可能会惹恼他们,因此请考虑与用户帐户集成。
- 依赖系统特定信息 - 我不是 .NET 开发人员,因此我不确定您可以获得多少系统唯一信息,但您可以提供的任何信息都会有所帮助。这实际上只会保护外部用户免于解密密码;理论上,任何有权访问该系统的人都可以获得它。
但请记住,如果您担心人们进入您的应用程序以提取密钥等内容,那么他们可以在发送之前轻松打印您需要发送的原始密码。如果您担心,那么您需要考虑其他选择