- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个X509Certificate2
实例,并获取其PrivateKey
属性,这是一个 RsaCryptoServiceProvider
。 MSDN 文档表明此 RsaCryptoServiceProvider
类不是线程安全的。因此,如果给定一些 X.509 证书,我需要在多个线程上执行非对称加密(通常在 Web 服务器上),创建 RsaCryptoServiceProvider
的多个实例的最佳方法是什么? ?
X509Certificate2
上的私钥没有标记为可导出,所以我不能简单地导出原始 RsaCryptoServiceProvider
上的参数并将它们重新导入到另一个实例中以解决线程安全问题。
我通过X509Store
获得了原件,但这似乎是 X509Certificate2
的集合例如,如果我想要 RsaCryptoServiceProvider
的新实例我必须实例化一个新 X509Store
找到一个新 X509Certificate2
,获得新 RsaCryptoServiceProvider
。让 .NET 克隆 RsaCryptoServiceProvider
看起来非常重量级。实例。
还有更好的方法吗?
最佳答案
尽管 RsaCryptoServiceProvider 的 MSDN 文档声明它不是线程安全的,但它的线程安全性似乎足以同时在多个线程上进行加密/解密。我编写了以下应用程序来使用此类测试高并发性,并且它根本没有崩溃或无法正确加密/解密:
using System;
using System.Diagnostics;
using System.Linq;
using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates;
using System.Threading;
namespace ConsoleApplication1 {
class Program {
static bool exit;
static void Main(string[] args) {
var store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
try {
store.Open(OpenFlags.OpenExistingOnly);
Func<RSACryptoServiceProvider> rsaFactory = null;
X509Certificate2 winningCert = null;
exit = true;
foreach (X509Certificate2 cert in store.Certificates) {
try {
var result = store.Certificates.Find(X509FindType.FindByThumbprint, cert.Thumbprint, false).Cast<X509Certificate2>().FirstOrDefault();
rsaFactory = () => (RSACryptoServiceProvider)result.PrivateKey;
UseRsa(rsaFactory());
winningCert = cert;
break;
} catch (CryptographicException) {
Console.WriteLine("Cert {0} failed", cert.Thumbprint);
}
}
exit = false;
Console.WriteLine("Winning cert: {0}", winningCert.Thumbprint);
RSACryptoServiceProvider rsa = (RSACryptoServiceProvider)winningCert.PrivateKey;
rsaFactory = () => rsa;
Thread[] threads = new Thread[16];
for (int i = 0; i < threads.Length; i++) {
threads[i] = new Thread(state => UseRsa(rsaFactory()));
threads[i].Start();
}
Thread.Sleep(10000);
exit = true;
for (int i = 0; i < threads.Length; i++) {
threads[i].Join();
}
Console.WriteLine("Success.");
} finally {
store.Close();
}
}
static void UseRsa(RSACryptoServiceProvider rsa) {
var rng = RandomNumberGenerator.Create();
var buffer = new byte[64];
do {
rng.GetBytes(buffer);
var cipher = rsa.Encrypt(buffer, true);
var plaintext = rsa.Decrypt(cipher, true);
for (int i = 0; i < buffer.Length; i++) {
if (buffer[i] != plaintext[i]) {
Debugger.Break();
}
}
} while (!exit);
}
}
}
关于asp.net - 缓解 Web 服务器上的 RsaCryptoServiceProvider 线程安全问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6140764/
如果您查看下面的代码,它只是创建了一个 RSACryptoServiceProvider 的新实例。 key 容器名称是从一个属性初始化的,该属性根据各种参数创建名称。我在此演示代码中添加了硬编码值。
我需要使用 RSA 加密一些文本,然后使用私钥恢复它。我的问题是 RSACryptoServiceProvider.Encrypt() 每次都输出不同的值,即使使用相同的 key 也是如此。这是我放入
有人告诉我,对于非对称加密,您可以使用公钥加密明文并使用私钥解密。所以我尝试了以下方法: static void Main(string[] args) { RSACr
我在 MSDN( see Important note ) 上读到必须处理 RSACryptoServiceProvider。他们给出了例子: using (RSACryptoServiceProvi
我对商店的证书有疑问。在我的应用程序中,用户可以使用文件中的证书或商店中的证书。加载证书后,我使用证书作为签名数据。 可以使用文件中的证书,但我不能使用商店中的等效证书。 签名代码: // Sign
我正在使用 key 对对我的 XML 进行签名(使用 SignedXml),并将公钥作为嵌入式资源嵌入到我的应用中。 这里是我如何创建 key 对 sn -k Warehouse.snk sn -p
我有以下使用 RSA 生成公钥和私钥的代码。 // generate RSA 1024 using (var rsa = new RSACryptoServicePro
我正在尝试使用我自己的公钥和私钥初始化 RSACryptoServiceProvider。 据我所知,方法是调用构造函数 RSACryptoServiceProvider RSAalg = new R
我目前正在尝试创建一个 RSACryptoServiceProvider对象仅来自解码的 PEM 文件。经过几天的搜索,我确实设法解决了一个可行的解决方案,但它不是一个可以用于生产的解决方案。 简而言
我们正在导出公钥和私钥。私钥将由用 Magic 编写的非 .net 软件使用。开发人员对导出 key 的格式有疑问。是否有白皮书或其他资源来解释导出数据的格式? 最佳答案 关于导出的 blob 类型的
我有使用 RSACryptoServiceProvider 在 C# 中生成的公钥: 4kKhD/FWAMtQTRifArfXjxZN+6bOXTkHrVpyz/1wODhSOB
我有一个 X509Certificate2 变量,我正在尝试将该变量的私钥转换为 RSACryptoServiceProvider RSACryptoServiceProvider pkey = (R
我需要解密文本,但收到消息 The parameter is incorrect。 证书获取正确,已在 Windows 中注册。 在搜索问题时,我可以阅读建议更改分配给 IIS 网站的应用程序池中的用
我使用 RSACryptoServiceProvider 加密了一段文本。我导出了公钥和私钥。显然我只是想在解码器应用程序中公开公钥,所以我编写了如下代码: private const string
如果我有一个从非托管应用程序创建的 key ,并且如果我想将此 key 导入托管应用程序并生成另一个 key 或对其进行加密。基本上相同的 key 将从托管和非托管代码来回导入/导出。 因此什么相当于
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: Can RSACryptoServiceProvider (.NET’s RSA) use SHA256 f
一段时间以来,我一直在阅读 CodeProject 上的一篇文章,该文章解释了如何使用 RSA 提供程序进行加密和解密: RSA Private Key Encryption 虽然 2009 年的旧版
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.S
我正在尝试使用公钥加密与客户端和服务器进行通信。服务器应该生成一个 1024 位的公钥并将其发送给客户端,客户端将使用该 key 将加密数据发送回服务器。到目前为止,我已经用这个初始化了 RSACry
我目前正在处理一个简单的数据签名。这是我第一次使用签名,所以也许我做错了什么。但我认为使用 512 位 RSA 和 SHA1 哈希对 448 字节进行签名需要 4.6 秒是不正常的。 代码: byte
我是一名优秀的程序员,十分优秀!