System.Security.Cryptography.CryptographicException:对象已存在

时间:2014-11-24 15:44:54

标签: c# asp.net-mvc asp.net-mvc-4 c#-4.0 cryptography

这很奇怪。我有这种方法来加密字符串:

[System.Security.Permissions.PermissionSet(System.Security.Permissions.SecurityAction.Assert, Unrestricted = true)]
public static string Encrypt(this string stringToEncrypt, string key) {
    var cspp = new CspParameters { 
        KeyContainerName = key, 
        Flags = CspProviderFlags.UseMachineKeyStore 
    };
    var rsa = new RSACryptoServiceProvider(cspp) { 
        PersistKeyInCsp = true 
    };
    var bytes = rsa.Encrypt(System.Text.Encoding.UTF8.GetBytes(stringToEncrypt), true);
    return BitConverter.ToString(bytes);
}

这是我的客户:

private const string EncryptionKey = "pezhman";

static Random random = new Random();
public static int CreateSalt() {
    return random.Next(1000, 9999);
}

public void EncryptSomething() {
    var salt = CreateSalt();
    var plainText = salt + "," + DateTime.Now;
    var encryptionSaltKey = EncryptionKey + DateTime.Now.Date;
    // here im calling encryptor:
    var encryptedValue = plainText.Encrypt(encryptionSaltKey);
}

我在 ASP.NET MVC 4 应用程序中使用它。它工作得很好;但突然间它停止了工作。实际上,在本地,我没有问题,它的工作原理。但是,当我将代码发布到服务器时,我收到此错误:

  

System.Security.Cryptography.CryptographicException:对象已经存在   存在。

你知道这里发生了什么吗?我知道我可以grant access to the key to everyone我要问的是在服务器上发生了什么?有什么改变?什么样的变化可能导致问题?

1 个答案:

答案 0 :(得分:1)

  

我问的是,服务器上发生了什么?有什么改变?什么样的变化会导致问题?

一种可能性是最近发布的Windows安全更新MS14-059,但我无法解释您收到的错误消息。

基本上,该更新完全卸载了MVC 4.0.0.0并将其替换为服务器上的4.0.0.1,这给许多破坏构建的人带来了悲痛。由于加密可能依赖于非常特定于DLL版本号的内容,因此您可能希望从那里开始。您可以通过在没有安装上述安全补丁的计算机上测试您的应用程序来证明或反驳这一理论,以确定它是否重新开始工作。