2

(如果这是一个重复的帖子,请指点我原来的或告诉我要搜索什么。我找不到任何东西。谢谢!)

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

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

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

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

这些感觉像是非常基本的问题(羞愧),我听说过关于这些问题的讨论,但在我的搜索中我找不到任何东西。不确定要搜索什么(除了这篇文章标题中的内容)。

与往常一样,任何方向都将不胜感激。

谢谢!


编辑:

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

我正在编写一个通用监视器程序,需要将访问值、路径和命令保存在数据库中。我觉得最好对这些值进行加密,以尽量减少我们的基础设施等的暴露。

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

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

再次感谢大家!!

4

3 回答 3

2

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

话虽如此:您应该使用单向加密。否则为 SecureString。在这种情况下,考虑所有公共和私人成员都是不安全的。

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

检查此链接以使用盐进行加密: https ://stackoverflow.com/a/2138588/2416958

于 2014-05-27T22:24:38.823 回答
1

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

无论您对提交的密码使用什么修饰符(私有、受保护),该值仍然可能被盗。

于 2014-05-27T22:17:37.063 回答
0

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

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

于 2014-05-27T22:30:38.733 回答