Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在程序代码中安全地存储密码?_C#_.net_Security_Store_Securestring - Fatal编程技术网

C# 在程序代码中安全地存储密码?

C# 在程序代码中安全地存储密码?,c#,.net,security,store,securestring,C#,.net,Security,Store,Securestring,我的应用程序使用RijndaelManaged类来加密数据。作为这种加密的一部分,我使用一个加载了密码的SecureString对象,该密码将被转换为字节数组,并在运行时加载到RajindaelManaged对象的密钥中 我的问题是这个SecureString的存储。用户输入的密码可以在运行时输入,并且可以“安全地”加载到SecureString对象中,但是如果没有提供用户输入的密码,那么我需要默认设置 因此,问题最终归结为: 如果每次我的应用程序运行时都要将一些已知的字符串或字节数组加载到Se

我的应用程序使用RijndaelManaged类来加密数据。作为这种加密的一部分,我使用一个加载了密码的SecureString对象,该密码将被转换为字节数组,并在运行时加载到RajindaelManaged对象的密钥中

我的问题是这个SecureString的存储。用户输入的密码可以在运行时输入,并且可以“安全地”加载到SecureString对象中,但是如果没有提供用户输入的密码,那么我需要默认设置

因此,问题最终归结为:

如果每次我的应用程序运行时都要将一些已知的字符串或字节数组加载到SecureString对象中,我该怎么做?“加密”数据最终会被另一个应用程序解密,因此即使没有指定用户输入的密码,我仍然需要在数据从一个应用程序传输到另一个应用程序时对其进行加密。这意味着我不能将默认密码设置为随机密码,因为其他应用程序无法正确解密它

我正在考虑的一个可能的解决方案是创建一个只输出一个密码短语的dll,然后我使用该密码短语,并在运行时通过两个不同的哈希/重组函数运行它,最后将其馈送到secureString对象中。这足够安全吗


为清晰起见进行编辑*:加密数据通过计算机之间的文件传递。将其视为一个始终具有密码的Zip文件,如果用户未直接输入任何内容,则假定为默认密码。

使用硬编码到可执行文件中的字符串进行对称加密没有意义。它只会给人一种虚假的安全感。再多的散列也无法修复此方案

请参阅不同上下文中的相同点

我不清楚你为什么认为需要加密应用程序间的通信。如果这种通信是机器本地的,那么我认为不需要加密,特别是不特定于用户的加密。这是DRM计划吗


编辑:如果它被传递到另一台机器,也许你可以硬编码a,然后让另一台机器用匹配的私钥解密。

这篇文章应该同样适用于存储加密密码,您可以让操作系统为您的解密处理盐渍种子的加密。

让我先解决您的最后一个问题

“这足够安全吗?”

唯一能回答这个问题的人是你。这里没有人知道“足够安全”在应用程序上下文中的含义

您是否正在构建一个应用程序来记录少女的日记?当然,这将是“足够安全的”

您是否正在构建一个应用程序来加密军事级安全系统的信息或进行身份验证?不,甚至不接近

如果您打算将密码存储在源代码中并因此可执行,则只能依赖一种类型的安全性,即隐蔽性安全性

如果您的问题是无法或不愿将密码存储在源代码中,那么将其移动到单独的dll中不会解决任何问题,您只是将问题移动到了另一个项目中


然而,我想知道一些事情。你说“我必须默认一些东西”。是这样吗?您试图在源代码中存储安全密码字符串的默认值?“THISISNOTAPASSWORD”怎么样?

我觉得您应该使用PKI解决方案,而不是加密/解密。如果您有另一个应用程序需要使用加密数据,那么您可以为该应用程序提供一个密钥对,并将公钥提供给进行加密的应用程序。这样,您仍然可以保持数据的安全,但不会引入大量最终无法提供那么多保护的附加代码

快速的谷歌搜索给了我一篇关于在.Net中使用Windows证书库的代码项目文章

Eric Lippert的()

同时,阅读他的文章,以以下提示结束:

  • 如果可能的话,不要去那里。加密极难做到正确,而且一开始往往是错误的解决方案。使用其他技术来解决您的安全问题

  • 如果问题是不可信的客户端,那么不要构建需要信任客户端的安全解决方案

  • 如果您可以使用现成的零件,请这样做

  • 如果您不能使用现成的部件,并且必须使用密码系统,那么不要使用您不完全理解的密码系统

  • 如果你必须使用一个你不完全理解的密码系统,那么至少不要用它来解决它不是设计用来解决的问题

  • 如果您必须使用密码系统在树中滑行,那么至少不要让可能怀有敌意的客户端选择加密的消息。自己选择令牌。如果令牌必须包含来自客户端的信息,则以某种方式对其进行清理;要求它只能是直接的ASCII文本,插入随机空白,等等

  • 如果必须允许客户端选择令牌,则不要加密令牌本身。对令牌的加密安全哈希进行签名。攻击者更难选择生成所需哈希的令牌

  • 不要使用与保护传入消息相同的密钥对加密传出消息。为要执行的每个逻辑上不同的操作获取密钥对

  • 双向加密通信

  • 考虑使用吊销机制,这样一旦你知道Eve正在攻击你,你至少可以吊销她的许可证。(或者,您可以撤销已知已泄露的许可证,等等。)


  • 我把这个问题理解为提出了硬鳕鱼的替代品