gpt4 book ai didi

c# - 不可变值在 IIS 中发生变异?

转载 作者:太空宇宙 更新时间:2023-11-03 13:55:44 25 4
gpt4 key购买 nike

所以,过去几周我一直在努力解决以下问题,此时我几乎用尽了我的选择,因为情况看起来多么矛盾。

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

我用于解密的内部 key 以 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 年多,突然间这些异常将其关闭。

更新:有人要求我用异常的堆栈跟踪来澄清,但由于保密协议(protocol)的原因,我无法提供完整的堆栈跟踪。我可以说的是:

  • 抛出异常的对象是System.Security.DESCryptoServiceProvider.CreateDecryptor(Byte[] rgbKey, Byte[] rgbIV)方法
  • 原始 key (我们实际使用的 key )确实可以验证并且不会产生异常。尽管如此,我们还是会不时(并非总是)收到此异常,而不知道哪个是未验证的当前值
  • 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;
}
}

最佳答案

查看您的包装器 SymmetricEncryption.Decrypt。我的猜测是问题出在那里。它如何根据您的密码创建 key 。它是否使用 PasswordDeriveBytes还是其他一些半生不熟的解决方案?

如果失败,也许您可​​以尝试获得比“MyPassword”更好的 key 。

如果失败,也许您可​​以使用 web.config 加密。 Scott Gu wrote about it here.

关于c# - 不可变值在 IIS 中发生变异?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12265969/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com