Encryption 如何在客户端上加密和解密可能来自不同设备且服务器不';不存储任何加密密钥?

Encryption 如何在客户端上加密和解密可能来自不同设备且服务器不';不存储任何加密密钥?,encryption,passwords,aes,cbc-mode,Encryption,Passwords,Aes,Cbc Mode,我正在为我自己和家人制作一个像Lasspass这样的密码管理工具,但我在安全性方面遇到了一些问题。在阅读了LastPass技术白皮书之后,我非常好奇他们是如何仅在客户端完成这项工作的。 根据他们描述的“仅本地加密模型”,服务器仅存储加密信息。 这是否意味着他们不在服务器端存储任何用于AES解密的密钥、IV或salt? 据我所知,如果我在同一台设备上加密和解密,这可能没问题,但我使用Lasspass在计算机上添加密码,但我可以在手机上看到密码。 他们如何在手机上解密? 手机应该没有密钥,没有IV和

我正在为我自己和家人制作一个像Lasspass这样的密码管理工具,但我在安全性方面遇到了一些问题。在阅读了LastPass技术白皮书之后,我非常好奇他们是如何仅在客户端完成这项工作的。 根据他们描述的“仅本地加密模型”,服务器仅存储加密信息。 这是否意味着他们不在服务器端存储任何用于AES解密的密钥、IV或salt? 据我所知,如果我在同一台设备上加密和解密,这可能没问题,但我使用Lasspass在计算机上添加密码,但我可以在手机上看到密码。 他们如何在手机上解密? 手机应该没有密钥,没有IV和盐用于计算机端加密,不是吗

我目前正在使用ASP.NET Core 3.0+React+identityserver

如何实现真正安全的“仅本地加密模型”? 有人能告诉我一些方向吗?
谢谢你的帮助。

首先:我不知道lastpass的实现,或者论文

但让我们看看我们能做些什么

假设我们有一个为我们存储二进制数据的服务器,而且它是基于每个用户/帐户来存储二进制数据的

我们需要什么才能授权帐户功能,如“替换数据”或“请求存储数据”

我们需要一个必须由客户来解决的任务来证明客户身份,换句话说,一个当且仅当客户持有特定秘密时才能解决的操作。。。这就需要不对称加密和/或数字签名。。。钥匙对

如果我们没有共享存储来安全地存储密钥并在两个不同的设备之间共享密钥,我们怎么能做到这一点

一个可能的解决方案非常简单,首先是。。。PBKDF2。。。密码派生密钥派生函数

PBKDF2接受一个密码、一个salt、一个轮数参数,并为您提供。。。位。。。伪随机比特

获取您的用户名并将其散列…=>完美的盐…
取任意数字,如15000=>您的轮数(较大的数字会减慢计算过程->减慢暴力攻击,而您每次登录只需计算一次)
使用您的密码=>惊喜。。。密码

运行PBKDF2

从生成的比特流中提取几个字节作为您喜爱的CSPRNG(加密安全伪随机数生成器)的种子

使用您喜爱的CSPRNG生成新的(RSA、DSA、ECDSA等)密钥对

用钥匙

每次您在任何设备上运行这些步骤时,都会生成这个精确的密钥对

当然,这会将所述密钥对的安全性分解为PBKDF2的秘密参数的强度,这将是。。。你的密码

但是现在你有了密码的不对称加密

服务器存储公钥。。。只要求客户端解密一个数字(nonce)以及替换/检索数据的请求。。。能够解密nonce证明客户机知道密钥


您还可以从PBKDF2流派生AES密钥,以便在将密码数据库发送到服务器之前对其进行加密。。。或者在收到密码后对其进行解密

只是好奇地问,如果我使用PBKDF2生成的密钥(密码,用户名,15000),那么当帐户更改密码时,所有加密数据必须使用旧密码进行解密,并使用新密码进行加密,然后更新到服务器?另一个问题是CSPRNG是否用于生成公钥?例如,RSA公钥或AES IV?问题1。。。对的问题2:生成密钥通常只需要几个随机数……密钥生成算法只要求随机数,而不关心如何获得它们。。。只要没有人能预测或重建他们的世代(因此使用CSprng),你就应该是安全的。。。对于AES,密钥生成非常简单。。。从CSPRNG获得钥匙位,您就得到了您的钥匙。。。