C#解密值和公共类属性......风险是什么?

时间:2014-05-27 22:09:11

标签: c# encryption securestring

(如果这是重复的帖子,请指出原件或告诉我要搜索的内容。我找不到任何内容。谢谢!)

因此,我在数据库行中保存了加密的。我想检索数据库行的列值并将它们存储在类实例中。在DECRYPTED 的类上创建公共属性是否安全?

public class *DataRow*
{
    public string *DataElement* { get; set; }
    public string *Value_Decrypted* { get; set; }
}

外部进程可以以某种方式访问​​公共财产吗?我是否需要使用SecureString(或其他东西)来防止内存攻击? .NET的DataProtection是否有助于解决这些问题?

是否有一个实用的指南/演练如何处理这个(希望没有太多的编码开销)?

这些感觉就像非常基本的问题(惭愧),我听说过这些问题,但在我的搜索中我找不到任何东西。不知道要搜索什么(除了这篇文章标题中的内容)。

与往常一样,任何方向都将受到高度赞赏。

谢谢!


编辑:

谢谢大家的回复。密码是一个不好的例子 - 我知道这是不明智的,通常没有必要解密密码。相对于如何处理需要解密的数据,我想我的问题更为笼统。我已更新我的示例以引用加密/解密的而不是密码。

我正在编写一个通用的监控程序,需要在数据库中保存访问值,路径和命令。我觉得最好加密这些价值观,以尽量减少我们基础设施的曝光等。

共识似乎是以任何形式,财产或其他方式保存解密值是一个坏主意。

我现在认为我只会存储加密值,然后在每次需要时使用SecureString对其进行解密。

再次感谢大家!!

3 个答案:

答案 0 :(得分:2)

通常不需要密码解密。如果你让用户选择自己的密码,这甚至是不道德的。

说完了: 您应该使用单向加密。否则是SecureString。在这种情况下,请考虑所有不安全的公共和私人成员。

对于单向加密,一些基础知识:加密密码。将其存储在数据库中。如果要检查密码,请加密输入的数据并检查它是否与数据库中的加密值匹配。加密通常以随机盐值播种。

使用salt检查此链接是否加密: https://stackoverflow.com/a/2138588/2416958

答案 1 :(得分:1)

最佳做法是使用单向加密方法来加密密码。这可以防止原始数据暴露给任何第三方,并且只能由密码所有者验证。

无论您使用什么修饰符进行密码归档(私有,受保护),该值仍然可能被盗。

答案 2 :(得分:0)

就像Stefan所说,解密密码并将解密版本存储在任何地方的任何时间都不是一个好主意。它不安全,有时不道德。你甚至不能解密你的用户'密码。一旦用户输入他们的密码,这应该是最后一次在其解密的表格中看到所述密码。 您不希望加密密码通过网络从服务器发回,因为攻击者可能会找到模式并找出您的加密方法,这也是不可取的。这就是为什么每当用户尝试登录时,您会在内部尝试并加密它并根据加密版本进行检查。

类字段的公共/私有访问修饰符从未用于安全目的。它们用于设计目的的封装和数据隐藏(例如,私有字段总是可以通过反射访问)。