2

所以,在过去的几周里,我一直在试图找出以下问题,此时我几乎用尽了我的选择,因为情况看起来多么矛盾。

我有一个在 SharePoint 下开发的应用程序,但它基本上是 ASP.NET 代码。我有一个加密的连接字符串,我将其解密在内存中并将其存储在配置对象中以访问数据库。我的配置对象是静态的(可通过Service Locator模式访问),我稍后会使用它来播种 LINQ-to-SQL 数据上下文。

我用于解密的内部密钥私下存储在一个类中private static readonly string myPassword = "MyPassword";(仅作为示例,实际密码更复杂且更有效)。在任何地方都没有引用该字段的单一语句,除了静态方法上的一个语句,它使用它作为另一种解密方法(实例方法)的参数,该方法用它实例化一个新方法DESCryptoServiceProvider

而且,我的生产服务器日志中不时出现以下异常:

Exception type: CryptographicException
Exception message: Specified key is a known weak key for 'DES' and cannot be used.

因此,连接字符串解密失败,当然,数据库不再被访问。噗,申请下来了。

这怎么可能?

免责声明:这是我正在维护的旧应用程序。我在此处提供的描述是为了帮助排除故障,但我无法更改它在内部的工作方式。有些人会同意这不是最好的方法,但该应用程序已经运行了 2 年多没有问题,突然这些异常正在取消它。

更新:我被要求用异常的堆栈跟踪来澄清,但由于 NDA 的原因我不能提供一个完整的堆栈跟踪。我说的是以下几点:

  • 抛出异常的对象是System.Security.DESCryptoServiceProvider.CreateDecryptor(Byte[] rgbKey, Byte[] rgbIV)方法
  • 原始密钥(我们实际使用的密钥)会验证并且不会产生异常。尽管如此,我们还是不时(并非总是)得到这个异常,不知道哪个是不验证的当前值
  • 的实例DESCryptoServiceProvider被静态、私有地存储在一个辅助类中
  • 这都是由 , 触发的System.Web.HttpApplication.InitModulesCommon(),以初始化应用程序内部部分

此外,这是一个模糊的堆栈跟踪:

at System.Security.Cryptography.DESCryptoServiceProvider.CreateDecryptor(Byte[] rgbKey, Byte[] rgbIV)
at SymmetricEncryption.Decrypt(String contents, String key)
// our helper, just a wrapper, based from this class: http://www.codeproject.com/Articles/1967/Encryption-Decryption-with-NET
at EncryptedConnectionStringHelper.DecryptUserAndPass(String connectionString)\
// our container for parsing the connection string and decrypting the user and password, not the full connstring is encrypted
at OurModule.Init(OurConfigurationSection config)
at OurModule.Boot(OurConfigurationSection config)
at OurModule.Boot()
at OurModule.Init(HttpApplication context)
at System.Web.HttpApplication.InitModulesCommon()
at System.Web.HttpApplication.InitInternal(HttpContext context, HttpApplicationState state, MethodInfo[] handlers)
at System.Web.HttpApplicationFactory.GetNormalApplicationInstance(HttpContext context)
at System.Web.HttpApplicationFactory.GetApplicationInstance(HttpContext context)
at System.Web.HttpRuntime.ProcessRequestInternal(HttpWorkerRequest wr)

我们的应用程序通过以下方式注册此模块:

public class OurModule : IHttpModule
{
    public static bool initialized = false;

    public void Init(HttpApplication context)
    { 
        if (!initialized) {
            subscribe(context);
            OurModule.Boot();
            initialized = true;
        }
    }
4

2 回答 2

1

看看你的包装SymmetricEncryption.Decrypt。我的猜测是问题就在那里。它如何从您的密码创建密钥。它是否使用PasswordDeriveBytes或其他一些半生不熟的解决方案?

失败了,也许您可​​以尝试获得比“MyPassword”更好的密钥。

失败了,也许你可以使用 web.config 加密。Scott Gu 在这里写过。

于 2012-09-04T16:21:25.033 回答
0

听起来好像没有任何东西在改变对象。听起来“某事”(如果您发布了堆栈跟踪会更清楚)正在验证DES 密钥......并抱怨它是一个已知的弱密钥。

理想情况下,您当然应该更改密码以更安全 - 但如果您不能,您应该查看该异常的确切来源,并查看某处是否有控制验证方式和时间的设置。

如果您还没有记录完整的堆栈跟踪(而不仅仅是异常消息),那是您应该做的第一件事。

于 2012-09-04T14:47:25.260 回答