存储 RSA 密钥并在 .Net 核心中使用它的最佳方法(寻找跨平台解决方案)
Best way to store RSA key and use it in .Net core(looking for a cross-platform solution)
我目前正在使用这个 link 将我的 RSA 密钥存储在 windows 密钥容器(机器级)中并且它工作正常,但我正在寻找一种适用于Linux 和 windows 因为我肯定会在 Linux.
上部署这个项目
public static void StoreRSAKey(string containerName, string xmlKey)
{
#pragma warning disable CA1416 // Validate platform compatibility
var parameters = new CspParameters
{
KeyContainerName = containerName
};
#pragma warning restore CA1416 // Validate platform compatibility
parameters.Flags = CspProviderFlags.UseMachineKeyStore;
using RSACryptoServiceProvider? rsa = new RSACryptoServiceProvider(parameters);
rsa.FromXmlString(xmlKey);
}
我在网上找到了一些建议,但我需要一个更精确的解决方案。
如果有人能帮助我解决这个问题,我会很高兴。
Best way to store RSA key and use it in .Net core(looking for a cross-platform solution)
IMO,问题应该是,是否可以在 .net core 中为 cross-platform 使用 RSA 密钥?
我最近建立了 open-source 加密和解密库,花了几个小时调查你问的同一个问题。简短的回答是无法将 CspParameters 与 Linux 一起使用,它适用于 Windows OS(如 所述)。又因为答案不可能,所以没有最好的办法。
所以首先,让我们看看是否可以回答在 .net 核心中使用 RSA 密钥的问题 cross-platform。
要做到这一点非常简单,您需要执行以下操作:
Rsa = RSA.Create();
Rsa.KeySize = 2048;
这部分不需要安装库,它是netstandard2.0的一部分。
就是这样,现在要导出和导入您生成的密钥,您可以执行以下操作。
当您首先 RSA.Create()
时,您可以导出密钥并将其存储在安全的任何地方以供以后使用。
导出私钥并妥善保管
Rsa.ToXmlString(true);
导出public密钥,用
加密
Rsa.ToXmlString(false);
当您需要从本地商店导入密钥时,您可以执行以下操作:
Rsa.FromXmlString(asymmetricKey);
这是 windows、Linux 或 Mac 计算机的 cross-platform 兼容解决方案。
也可以使用 X509Certificate2
从本地计算机导入证书,并使用其 public 密钥进行加密,使用私钥进行解密。
也可以将私钥参数导入RSAParameters
,这需要一个辅助方法来翻译私钥文件中的XML标签:
<RSAKeyValue>
<Modulus>xxxx...</Modulus>
<Exponent>xxxx</Exponent>
<P>xxxx...</P>
<Q>xxxx...</Q>
<DP>xxxx...</DP>
<DQ>xxxx...</DQ>
<InverseQ>xxxx...</InverseQ>
<D>xxxx...</D>
</RSAKeyValue>
但我发现使用 FromXmlString
更容易,并且在创建 RSA.Create()
时它是 RSA
class 的一部分,所以不需要辅助方法,也就是说如果性能对您的项目很重要,您需要进行性能测试以比较结果。
所以最后我提供了一个如何存储和加载密钥的简单示例:
public static void Main(string[] args)
{
var rsa = RSA.Create();
rsa.KeySize = 2048;
// public key for decrypting
var privateKey = rsa.ToXmlString(true);
SaveKey(@"privateKey", privateKey);
// public key for encrypting
var publicKey = rsa.ToXmlString(false);
SaveKey(@"publicKey", publicKey);
// initialize the private for use on another instance
var rsaAnotherPlace = RSA.Create();
rsaAnotherPlace.KeySize = 2048;
rsaAnotherPlace.FromXmlString(LoadKey(@"privateKey"));
}
// store my keys
public static void SaveKey(string filename, string content)
{
var bytes = Encoding.ASCII.GetBytes(content);
using var fs = new FileStream(filename, FileMode.Create, FileAccess.Write);
fs.Write(bytes, 0, bytes.Length);
}
// load key
public static string LoadKey(string filename)
{
var bytes = File.ReadAllBytes(filename);
return Encoding.ASCII.GetString(bytes);
}
我已经在 Windows 和 Linux OS 上测试了解决方案,它通过了 GitHub 操作上的 macOS 测试,但我没有在 macOS.
上测试过
Disclaimer: this is the open-source library I am working on.
我目前正在使用这个 link 将我的 RSA 密钥存储在 windows 密钥容器(机器级)中并且它工作正常,但我正在寻找一种适用于Linux 和 windows 因为我肯定会在 Linux.
上部署这个项目public static void StoreRSAKey(string containerName, string xmlKey)
{
#pragma warning disable CA1416 // Validate platform compatibility
var parameters = new CspParameters
{
KeyContainerName = containerName
};
#pragma warning restore CA1416 // Validate platform compatibility
parameters.Flags = CspProviderFlags.UseMachineKeyStore;
using RSACryptoServiceProvider? rsa = new RSACryptoServiceProvider(parameters);
rsa.FromXmlString(xmlKey);
}
我在网上找到了一些建议,但我需要一个更精确的解决方案。
如果有人能帮助我解决这个问题,我会很高兴。
Best way to store RSA key and use it in .Net core(looking for a cross-platform solution)
IMO,问题应该是,是否可以在 .net core 中为 cross-platform 使用 RSA 密钥?
我最近建立了 open-source 加密和解密库,花了几个小时调查你问的同一个问题。简短的回答是无法将 CspParameters 与 Linux 一起使用,它适用于 Windows OS(如
所以首先,让我们看看是否可以回答在 .net 核心中使用 RSA 密钥的问题 cross-platform。
要做到这一点非常简单,您需要执行以下操作:
Rsa = RSA.Create();
Rsa.KeySize = 2048;
这部分不需要安装库,它是netstandard2.0的一部分。
就是这样,现在要导出和导入您生成的密钥,您可以执行以下操作。
当您首先 RSA.Create()
时,您可以导出密钥并将其存储在安全的任何地方以供以后使用。
导出私钥并妥善保管
Rsa.ToXmlString(true);
导出public密钥,用
加密Rsa.ToXmlString(false);
当您需要从本地商店导入密钥时,您可以执行以下操作:
Rsa.FromXmlString(asymmetricKey);
这是 windows、Linux 或 Mac 计算机的 cross-platform 兼容解决方案。
也可以使用 X509Certificate2
从本地计算机导入证书,并使用其 public 密钥进行加密,使用私钥进行解密。
也可以将私钥参数导入RSAParameters
,这需要一个辅助方法来翻译私钥文件中的XML标签:
<RSAKeyValue>
<Modulus>xxxx...</Modulus>
<Exponent>xxxx</Exponent>
<P>xxxx...</P>
<Q>xxxx...</Q>
<DP>xxxx...</DP>
<DQ>xxxx...</DQ>
<InverseQ>xxxx...</InverseQ>
<D>xxxx...</D>
</RSAKeyValue>
但我发现使用 FromXmlString
更容易,并且在创建 RSA.Create()
时它是 RSA
class 的一部分,所以不需要辅助方法,也就是说如果性能对您的项目很重要,您需要进行性能测试以比较结果。
所以最后我提供了一个如何存储和加载密钥的简单示例:
public static void Main(string[] args)
{
var rsa = RSA.Create();
rsa.KeySize = 2048;
// public key for decrypting
var privateKey = rsa.ToXmlString(true);
SaveKey(@"privateKey", privateKey);
// public key for encrypting
var publicKey = rsa.ToXmlString(false);
SaveKey(@"publicKey", publicKey);
// initialize the private for use on another instance
var rsaAnotherPlace = RSA.Create();
rsaAnotherPlace.KeySize = 2048;
rsaAnotherPlace.FromXmlString(LoadKey(@"privateKey"));
}
// store my keys
public static void SaveKey(string filename, string content)
{
var bytes = Encoding.ASCII.GetBytes(content);
using var fs = new FileStream(filename, FileMode.Create, FileAccess.Write);
fs.Write(bytes, 0, bytes.Length);
}
// load key
public static string LoadKey(string filename)
{
var bytes = File.ReadAllBytes(filename);
return Encoding.ASCII.GetString(bytes);
}
我已经在 Windows 和 Linux OS 上测试了解决方案,它通过了 GitHub 操作上的 macOS 测试,但我没有在 macOS.
上测试过Disclaimer: this is the open-source library I am working on.