在数据库中存储RsaSecurityKey

时间:2018-01-04 14:49:58

标签: c# postgresql asp.net-core rsa identityserver4

如何在关系数据库(如Postgres)中存储类RsaSecurityKey https://msdn.microsoft.com/en-us/library/system.identitymodel.tokens.rsasecuritykey(v=vs.110).aspx的对象?

我必须创建RsaSecurityKey(第一次)并将密钥存储在db中并在Identity Server中使用它(使用IdentityServer4库)来签署Jwt令牌。

3 个答案:

答案 0 :(得分:2)

我不确定您是否能够按原样将该类型的对象存储到数据库中,因为它们不可序列化 - 例如:如果您尝试使用.NET BinaryFormatter来把它变成一个字节数组,它将失败并带有SerializationException

一些谷歌搜索显示还有其他人也遇到过这个问题,例如在AzureAD项目中:

https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/issues/591

如果您在该问题中关注the pull request,那么源代码似乎可以满足您的需求。 注意:如果您打算使用许可,请务必了解许可。

答案 1 :(得分:2)

在IdentityServer中,我们将整个RSA密钥序列化为JSON对象。

https://github.com/IdentityServer/IdentityServer4/blob/666d76d07a790f6c1e2f35a8a90def66f7b9268c/src/IdentityServer4/Configuration/DependencyInjection/BuilderExtensions/Crypto.cs#L108-L146

您可以使用相同的技术将密钥存储在数据库中。

答案 2 :(得分:0)

您可以存储创建密钥的参数,而不是存储密钥。 原始RSAParameters无法正确序列化,this question如何做到这一点。 下面的示例使用文件而不是db来存储参数,但是您明白了。

RSAParameters param;
try{
    var json = File.ReadAllText(paramFile);
    param = JsonConvert.DeserializeObject<RSAParameters>(json);
}catch(Exception _)
{
    param = new RSACryptoServiceProvider(2048).ExportParameters(true);
    var jsonString = JsonConvert.SerializeObject(param);
    File.WriteAllText(paramFile, jsonString);
}
var securityKey = new RsaSecurityKey(param);