使用用户密码 (AES) 的安全私钥 (RSA)
Secure Private Key (RSA) with user password (AES)
我需要在 ASP.NET 核心应用程序中对一些数据进行高度加密。
当时的想法是:
用户将拥有散列密码。用户还将拥有一个非对称密钥 (RSA-512)。 public 键存储在数据库中。私钥首先由对称密钥 (AES-256) 加密。作为此加密的密钥,我们使用用户的 plain/text 密码。
如果我想创建一些东西,例如汽车实体。我将为这个特定的汽车实体生成一个 public 和私钥。 public 键以纯文本形式存储。私钥使用 'car'(用户)创建者的 public 密钥加密。
属于汽车的字段然后使用汽车的 public 密钥加密。
解密汽车。我们需要用户的私钥,因为需要用它来解密汽车的私钥。有了这个解密的汽车私钥,我们就可以解密汽车的内容了。
但是要成为用户的私钥,我需要用plain/text密码解密。此密码仅在@登录时可用(当然不会存储在任何地方)。
我现在遇到的问题是我正在使用带有 IdentityServer 4 的联合登录系统。这与我的 API 项目不同 'project'。
但我需要 API 中的密码,因为这会执行我的 'Business Logic'。
真正的问题从这里开始:
解决这个问题:
我正在考虑在我的 API 中添加一个 'route' 以便我的登录项目可以调用。
因此,每次用户登录登录项目时,都会对正确的 API 执行 REST 调用,消息为:'Here is the decrypted version of the private key of user X'.
此时 API 会将其存储在 'InMemory' EF Core 数据库中。每次用户需要解密他的汽车数据时。我需要从 'InMemory' 数据库中检索私钥。
我这里有问题。 EF 'InMemory' DB 是否用于此目的?看起来它仅用作演示或测试目的。
什么时候删除内存私钥。如果用户注销,我可以管理它。但是当用户 'expires' 我无法触发这个。所以他解密后的私钥会一直存在内存中
'InMemory' 数据库的可靠性如何?它什么时候 'cleans' 本身?
我很高兴收到一些有用的提示。
此致,布莱希特
除了安全问题(见评论),InMemoryDatabase 主要用于测试或无数据库教程。您添加到其中的所有内容都将保留在那里,直到 deleted(有时垃圾收集,您实际上无法控制!)或 DbContext 被释放。
而不是 InMemory EF Core 数据库,使用内存缓存(分布式或本地)更有意义。
您当然可以使用像 Redis 这样的分布式缓存并将解码后的私钥保存在其中,然后从您的服务中调用它。您可以添加一个 expiry date, when the key becomes invalidated and needs to be requested or extend the expire time by calling expire command on the key and when user logs out, delete the key with del.
如果您扩展服务器,它也能很好地工作。如果您从 Microsoft.Extensions.Caching.Memory
开始,您以后可以轻松切换到 Redis,因为它们都实现了 IDistributableCache
接口,只需在启动时更改配置 class.
您可能还想尝试使用 SecureString(请参阅 here), which isn't directly implemented in .NET Core but available as extra package here)在本地内存中尽可能短地保留它,而不是依赖 GC 在某些时候执行它。
我需要在 ASP.NET 核心应用程序中对一些数据进行高度加密。
当时的想法是: 用户将拥有散列密码。用户还将拥有一个非对称密钥 (RSA-512)。 public 键存储在数据库中。私钥首先由对称密钥 (AES-256) 加密。作为此加密的密钥,我们使用用户的 plain/text 密码。
如果我想创建一些东西,例如汽车实体。我将为这个特定的汽车实体生成一个 public 和私钥。 public 键以纯文本形式存储。私钥使用 'car'(用户)创建者的 public 密钥加密。
属于汽车的字段然后使用汽车的 public 密钥加密。
解密汽车。我们需要用户的私钥,因为需要用它来解密汽车的私钥。有了这个解密的汽车私钥,我们就可以解密汽车的内容了。
但是要成为用户的私钥,我需要用plain/text密码解密。此密码仅在@登录时可用(当然不会存储在任何地方)。
我现在遇到的问题是我正在使用带有 IdentityServer 4 的联合登录系统。这与我的 API 项目不同 'project'。
但我需要 API 中的密码,因为这会执行我的 'Business Logic'。
真正的问题从这里开始:
解决这个问题:
我正在考虑在我的 API 中添加一个 'route' 以便我的登录项目可以调用。 因此,每次用户登录登录项目时,都会对正确的 API 执行 REST 调用,消息为:'Here is the decrypted version of the private key of user X'.
此时 API 会将其存储在 'InMemory' EF Core 数据库中。每次用户需要解密他的汽车数据时。我需要从 'InMemory' 数据库中检索私钥。
我这里有问题。 EF 'InMemory' DB 是否用于此目的?看起来它仅用作演示或测试目的。
什么时候删除内存私钥。如果用户注销,我可以管理它。但是当用户 'expires' 我无法触发这个。所以他解密后的私钥会一直存在内存中
'InMemory' 数据库的可靠性如何?它什么时候 'cleans' 本身?
我很高兴收到一些有用的提示。
此致,布莱希特
除了安全问题(见评论),InMemoryDatabase 主要用于测试或无数据库教程。您添加到其中的所有内容都将保留在那里,直到 deleted(有时垃圾收集,您实际上无法控制!)或 DbContext 被释放。
而不是 InMemory EF Core 数据库,使用内存缓存(分布式或本地)更有意义。
您当然可以使用像 Redis 这样的分布式缓存并将解码后的私钥保存在其中,然后从您的服务中调用它。您可以添加一个 expiry date, when the key becomes invalidated and needs to be requested or extend the expire time by calling expire command on the key and when user logs out, delete the key with del.
如果您扩展服务器,它也能很好地工作。如果您从 Microsoft.Extensions.Caching.Memory
开始,您以后可以轻松切换到 Redis,因为它们都实现了 IDistributableCache
接口,只需在启动时更改配置 class.
您可能还想尝试使用 SecureString(请参阅 here), which isn't directly implemented in .NET Core but available as extra package here)在本地内存中尽可能短地保留它,而不是依赖 GC 在某些时候执行它。