我工作的开发人员使用证书的私钥在我们的生产服务器上签署有效负载时遇到了一些困难。该代码适用于他的开发盒和生产服务器,但两个不同的位置最终会为同一个有效负载签署不同的签名。我们已经确认它在两个位置都是相同的证书,但由于某种原因,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页面,我们在其中创建有效负载,然后将访问者转发到供应商的页面以及加密的有效负载。
希望有人可以在这里流下或看到过类似的东西。
答案 0 :(得分:2)
更改强>
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);
将从PrivateKey获取ContainerName。 好的头像pic;)
答案 1 :(得分:2)
随机填充不用于PKCS1 V 1.5 SIGNATURE(如PKCS1 RSA文件中所述的EMSA-PKCS1-v1_5)。它仅用于ENCRYPTION(即使用公钥加密)
答案 2 :(得分:1)
RSA使用random padding。您无法保证同一纯文本的两个签名是相同的。
答案 3 :(得分:0)
尝试验证针对公钥的不同签名...只要两个签名都有效,就没有问题