我应该使用哪种设计模式进行加密?

时间:2011-03-24 20:12:16

标签: c# encryption design-patterns

我正在尝试用C#编写加密/解密例程。我想要的关键&盐可配置,因为它可以来自各种不同的存储区域,例如, web.config,db,file等...所以它必须灵活且可扩展。

为了调用加密类,我想公开它以便密钥和密钥。为了加密或解密,例如,不需要盐作为方法参数。我只会传入纯文本或密文。使用该课程的任何人都不应该确定钥匙或盐的位置。

我认为工厂模式可能有所帮助,但不能完全考虑如何构建它。任何人?

4 个答案:

答案 0 :(得分:1)

每个加密对象的盐应该是唯一的(也就是说,如果你有N个密码,你应该有N个盐,盐不一定必须是唯一的,尽管它们应该是相当独特的)。在多个对象之间共享盐会破坏salt的目的(这会增加数据库被盗时破解密码的时间复杂性。)

就设计而言,您可以拥有密钥提供程序和salt生成器接口,然后为您要使用的各种源实现各种提供程序/生成器。然后,您只需要为他们提供一种方法来指定他们想要使用哪个提供商ChunkyMonkey.KeyProvider = new WebKeyProvider(uri);,然后对您的课程的调用看起来像ChunkyMonkey.Encrypt(stuff);

答案 1 :(得分:0)

根据您的限制,听起来您应该定义一个提供密钥和salt的接口,然后在使用时将实现该接口的对象传递给加密类或方法。

答案 2 :(得分:0)

您可以让工厂类从配置使用的位置检索salt / key,然后将其注入从工厂类检索的每个加密类实例中。这样,加密类的消费者不知道salt / key来自何处。这样做的问题是你会重复使用你的盐,而你正在打败盐腌的目的。你需要为你的哈希生成独特的盐。

答案 3 :(得分:0)

工厂模式听起来不错。首先创建一个公开加密/解密方法的接口,然后让一个类生成一个实现该接口的实例。不要直接使用可以从中检索密钥的类,因为这当然会抵消安全性(用户可以简单地将其强制转换)。

现在你应该使用一个随机数生成器,每次调用encrypt函数时都会创建一个salt。 salt可以与密文分开返回,但是您需要将其与密文一起存储。如果原始密钥实际上是密码,则应使用PBKDF2或类似密钥来使用salt和密钥创建密钥。否则,您可以使用salt和安全哈希方法。