所以,过去几周我一直试图找出以下问题,而且此时我几乎已经筋疲力尽了,因为情况似乎有些矛盾。
我有一个开发用于在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;
}
}
答案 0 :(得分:1)
查看您的包装SymmetricEncryption.Decrypt
。我猜这个问题就在那里。它如何从您的密码创建密钥。它是使用PasswordDeriveBytes还是其他一半烘焙解决方案?
如果失败,也许你可以尝试获得比“MyPassword”更好的密钥。
如果失败,也许你可以使用web.config加密。 Scott Gu wrote about it here.
答案 1 :(得分:0)
这听起来不像是突变对象。这听起来像“某事”(如果你发布了堆栈跟踪它会更清楚)是验证 DES密钥......并抱怨它是一个已知的弱密钥。
理想情况下,您应该更改密码以保证更安全 - 但如果您不能,则应该查看该异常的确切位置,并查看是否存在控制如何以及何时验证的设置。
如果您还没有记录完整的堆栈跟踪(而不仅仅是异常消息),那么您应该执行第一个事情。