【发布时间】:2018-08-25 04:09:34
【问题描述】:
我正在将一些 .NET Framework 库切换到 .NET Standard。我的一个库使用本地计算机上的证书存储来处理 JSON Web 令牌 (JWT)。图书馆使用的是RSACryptoServiceProvider,现在好像是not recommended了。
因此,我转而使用 GetPublicKey() 和 GetPrivateKey() 扩展方法,但我遇到了私钥问题。每当我在收到的私钥的 RSA 实例上调用 Decrypt 时:
{Internal.Cryptography.CryptoThrowHelper+WindowsCryptographicException: 访问被拒绝 System.Security.Cryptography.RSACng.EncryptOrDecrypt(SafeNCryptKeyHandle key, Byte[] 输入, AsymmetricPaddingMode paddingMode, Void* paddingInfo, EncryptOrDecryptAction encryptOrDecrypt) 在 System.Security.Cryptography.RSACng.EncryptOrDecrypt(字节 [] 数据, RSAEncryptionPadding 填充,EncryptOrDecryptAction encryptOrDecrypt) 在 System.Security.Cryptography.RSACng.Decrypt(字节 [] 数据, RSAEncryptionPadding 填充)
以下是导致异常的代码的简短示例:
public X509Certificate2 GetCert() {
using (var certStore = new X509Store(StoreName.My, StoreLocation.LocalMachine)) {
certStore.Open(OpenFlags.ReadOnly);
var certMatches = certStore.Certificates.Find(X509FindType.FindByThumbprint, CertificateThumbprint, false);
return certMatches[0];
}
}
var cert = GetCert();
var publicKey = cert.GetRSAPublicKey();
var encryptedBytes = publicKey.Encrypt(bytes, System.Security.Cryptography.RSAEncryptionPadding.OaepSHA256);
var privateKey = cert.GetRSAPrivateKey();
// Exception on this line. :(
var decryptedBytes = privateKey.Decrypt(encryptedBytes, System.Security.Cryptography.RSAEncryptionPadding.OaepSHA256);
同样的代码使用RSACryptoServiceProvider 工作。我已验证用户有权访问商店中证书的私钥。
是什么导致了这个拒绝访问异常?
【问题讨论】:
-
我认为 .NET 标准 2.0 包含
RSACryptoServiceProvider是否不正确?如果是这样,你为什么要避免它? -
@MaartenBodewes 似乎避免它已成为 .NET 社区的普遍建议。一个例子:stackoverflow.com/questions/41986995/implement-rsa-in-net-core.
-
嗯,这是关于一个属性被忽略的问题。通常代码会在下面使用相同的功能。
-
感谢您的意见@MaartenBodewes。我用来处理 JWT 的库需要
RSA对象,如果使用RSACryptoServiceProvider则会抛出。所以我还在寻找解决方案。 -
@JustinHelgerson
((RSACng)privateKey).Key.KeyUsages说这是一个仅签名密钥?
标签: encryption .net-core x509certificate .net-standard