繁体   English   中英

安全私钥(RSA)和用户密码(AES)

[英]Secure Private Key (RSA) with user password (AES)

我需要对ASP.NET Core应用程序中的某些数据进行大量加密。

这个想法是:用户将具有哈希密码。 用户还将具有非对称密钥(RSA-512)。 公钥存储在数据库中。 私钥首先通过对称密钥(AES-256)进行加密。 作为此加密的密钥,我们使用用户的纯文本密码。

如果我想创建一些示例,例如汽车实体。 我将为此特定的汽车实体生成一个公共和私有密钥。 公钥以纯文本格式存储。 私钥使用“汽车”(用户)创建者的公钥加密。

然后,使用汽车的公共密钥对属于汽车的字段进行加密。

解密汽车。 我们需要用户的私钥,因为这需要解密汽车的私钥。 借助此解密的汽车私钥,我们可以解密汽车的内容。

但是要成为用户的私钥,我需要使用明文/文本密码对其进行解密。 该密码仅在登录时间@可用(当然不存储在任何地方)。

我现在遇到的问题是,我在IdentityServer 4中使用了联合登录系统。这是与我的API项目不同的“项目”。

但是我需要API中的密码,因为这可以执行我的“业务逻辑”。

真正的问题从这里开始:

解决此问题的方法:

我当时正在考虑在我的登录项目可以调用的API中添加“路由”。 因此,每次用户登录登录项目时,都会使用以下消息对正确的API执行REST调用: “此处是用户X私钥的解密版本”。

此时,API会将其存储在“ InMemory” EF Core数据库中。 每次用户需要解密其汽车数据时。 我需要从“ InMemory”数据库中检索私钥。

问题在这里。 EF“ InMemory”数据库是否用于此目的? 看起来它仅用作演示或测试目的。

什么时候删除内存的私钥。 如果用户注销,则可以对其进行管理。 但是,当用户“到期”时,我无法对此进行触发。 因此,他解密的私钥将保留在内存中。

“ InMemory”数据库的可靠性如何? 什么时候可以“清洗”自身?

很高兴收到一些有用的提示。

真诚的,布雷希特

除了安全性问题(请参阅注释),InMemoryDatabase主要用于测试或无数据库的教程。 您添加到其中的所有内容都将保留在那里,直到被删除 (有时还会收集垃圾,您实际上没有控制权!)或将DbContext处理掉。

代替InMemory EF Core数据库,使用内存缓存(分布式或本地)更有意义。

您当然可以使用像Redis这样的分布式缓存,并在其中保存已解码的私钥,然后从您的服务中调用它。 您可以添加一个失效日期,当密钥失效并需要请求时,或者通过在密钥上调用expire命令来延长失效时间,并且当用户注销时,请使用del删除密钥。

如果您扩展服务器,它也可以很好地工作。 如果您以Microsoft.Extensions.Caching.Memory开头,则稍后可以轻松切换到Redis,因为它们都实现了IDistributableCache接口,只需更改启动类中的配置即可。

您可能还想尝试使用SecureString(请参阅此处 ),它不是在.NET Core中直接实现的,而是在此处作为额外的包提供的),以使其在本地内存中的时间尽可能短,而不依赖于GC在运行时一点。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM