C# 在程序代码中安全地存储密码?
我的应用程序使用RijndaelManaged类来加密数据。作为这种加密的一部分,我使用一个加载了密码的SecureString对象,该密码将被转换为字节数组,并在运行时加载到RajindaelManaged对象的密钥中 我的问题是这个SecureString的存储。用户输入的密码可以在运行时输入,并且可以“安全地”加载到SecureString对象中,但是如果没有提供用户输入的密码,那么我需要默认设置 因此,问题最终归结为: 如果每次我的应用程序运行时都要将一些已知的字符串或字节数组加载到SecureString对象中,我该怎么做?“加密”数据最终会被另一个应用程序解密,因此即使没有指定用户输入的密码,我仍然需要在数据从一个应用程序传输到另一个应用程序时对其进行加密。这意味着我不能将默认密码设置为随机密码,因为其他应用程序无法正确解密它 我正在考虑的一个可能的解决方案是创建一个只输出一个密码短语的dll,然后我使用该密码短语,并在运行时通过两个不同的哈希/重组函数运行它,最后将其馈送到secureString对象中。这足够安全吗C# 在程序代码中安全地存储密码?,c#,.net,security,store,securestring,C#,.net,Security,Store,Securestring,我的应用程序使用RijndaelManaged类来加密数据。作为这种加密的一部分,我使用一个加载了密码的SecureString对象,该密码将被转换为字节数组,并在运行时加载到RajindaelManaged对象的密钥中 我的问题是这个SecureString的存储。用户输入的密码可以在运行时输入,并且可以“安全地”加载到SecureString对象中,但是如果没有提供用户输入的密码,那么我需要默认设置 因此,问题最终归结为: 如果每次我的应用程序运行时都要将一些已知的字符串或字节数组加载到Se
为清晰起见进行编辑*:加密数据通过计算机之间的文件传递。将其视为一个始终具有密码的Zip文件,如果用户未直接输入任何内容,则假定为默认密码。使用硬编码到可执行文件中的字符串进行对称加密没有意义。它只会给人一种虚假的安全感。再多的散列也无法修复此方案 请参阅不同上下文中的相同点 我不清楚你为什么认为需要加密应用程序间的通信。如果这种通信是机器本地的,那么我认为不需要加密,特别是不特定于用户的加密。这是DRM计划吗
编辑:如果它被传递到另一台机器,也许你可以硬编码a,然后让另一台机器用匹配的私钥解密。这篇文章应该同样适用于存储加密密码,您可以让操作系统为您的解密处理盐渍种子的加密。让我先解决您的最后一个问题 “这足够安全吗?” 唯一能回答这个问题的人是你。这里没有人知道“足够安全”在应用程序上下文中的含义 您是否正在构建一个应用程序来记录少女的日记?当然,这将是“足够安全的” 您是否正在构建一个应用程序来加密军事级安全系统的信息或进行身份验证?不,甚至不接近 如果您打算将密码存储在源代码中并因此可执行,则只能依赖一种类型的安全性,即隐蔽性安全性 如果您的问题是无法或不愿将密码存储在源代码中,那么将其移动到单独的dll中不会解决任何问题,您只是将问题移动到了另一个项目中
然而,我想知道一些事情。你说“我必须默认一些东西”。是这样吗?您试图在源代码中存储安全密码字符串的默认值?“THISISNOTAPASSWORD”怎么样?我觉得您应该使用PKI解决方案,而不是加密/解密。如果您有另一个应用程序需要使用加密数据,那么您可以为该应用程序提供一个密钥对,并将公钥提供给进行加密的应用程序。这样,您仍然可以保持数据的安全,但不会引入大量最终无法提供那么多保护的附加代码 快速的谷歌搜索给了我一篇关于在.Net中使用Windows证书库的代码项目文章Eric Lippert的() 同时,阅读他的文章,以以下提示结束:
我把这个问题理解为提出了硬鳕鱼的替代品