Зашифрованная подпись полезной нагрузки отличается при генерировании в .NET на разных ОС (Win7 против Win2008R2) - PullRequest
2 голосов
/ 25 июня 2011

Разработчик, с которым я работаю, сталкивается с некоторыми трудностями, используя закрытый ключ сертификата для подписи полезной нагрузки на нашем производственном сервере.Код работает как на его блоке разработки, так и на рабочем сервере, но в двух разных местах одна и та же полезная нагрузка заканчивается разной подписью.Мы подтвердили, что это один и тот же сертификат в обоих местах, но по какой-то причине метод RSACryptoServiceProvider.SignData, похоже, возвращает другое значение в зависимости от того, работает ли он в Windows 7 или Server 2008 R2.

Воткод, который мы используем - вы можете видеть, что мы заменили полезную нагрузку строкой Base64 из нашего конфигурационного файла, поэтому даже не возможно, что это может быть разница в полезной нагрузке, которая вызывает различные подписи.

byte[] encryptedSignature = new byte[1];
CspParameters cp = new CspParameters(24, "Microsoft Enhanced RSA and AES Cryptographic Provider", "{4FC30434-29E5-482D-B817-72102A046137}");
cp.Flags = CspProviderFlags.UseMachineKeyStore;
cp.KeyNumber = (int)KeyNumber.Exchange;

bool signatureVerified = false;

using (RSACryptoServiceProvider rsaCrypto = new RSACryptoServiceProvider(2048, cp))
{
    encryptedSignature = rsaCrypto.SignData(Convert.FromBase64String(Properties.Settings.Default.EncryptedSessionData), "SHA256");
    // Signature verifies properly on both servers
    signatureVerified = rsaCrypto.VerifyData(Convert.FromBase64String(Properties.Settings.Default.EncryptedSessionData), "SHA256", encryptedSignature);

}

Возможно ли, что сервер x64 мог обрабатывать сигнатуру иначе, чем наши рабочие станции для разработки x86?Это кажется маловероятным, но мы озадачены тем, почему рабочий сервер будет выдавать другую подпись.Кроме того, не уверен, имеет ли это значение, но этот код взят со страницы ASP.NET, где мы создаем полезную нагрузку, а затем перенаправляем посетителя на страницу поставщика вместе с зашифрованной полезной нагрузкой.пролить здесь или видел что-то подобное.

Ответы [ 4 ]

2 голосов
/ 10 ноября 2011

Случайная подпись НЕ используется в ПОДПИСИ PKCS1 V 1.5 (EMSA-PKCS1-v1_5, как указано в документе PKCS1 RSA). Он используется только в ENCRYPTION (т.е. шифровании с использованием открытых ключей)

2 голосов
/ 25 июня 2011

Изменение

CspParameters(24, "Microsoft Enhanced RSA and AES Cryptographic Provider", "{4FC30434-29E5-482D-B817-72102A046137}");

до

CspParameters cp = new CspParameters(24, "Microsoft Enhanced RSA and AES Cryptographic Provider", ((RSACryptoServiceProvider)cert.PrivateKey).CspKeyContainerInfo.KeyContainerName);

, который получит ContainerName от PrivateKey. Хорошая аватарка;)

1 голос
/ 25 июня 2011

RSA использует случайное заполнение .Вы не можете гарантировать, что две подписи одного и того же простого текста будут одинаковыми.

0 голосов
/ 26 июня 2011

попытаться проверить разные подписи с открытым ключом ... до тех пор, пока обе подписи действительны, проблем нет

...