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

How to encrypt and decrypt on the client that may come from a different device and the server doesn't store any encrypted key?

我正在做一个像Lasspass这样的密码管理工具给自己和家人使用,但是在安全方面遇到了一些问题。看完 LastPass-Technical-Whitepaper 后,我很好奇他们是如何只在客户端做到这一点的。 根据他们描述的 "Local-Only Encryption Model" ,服务器只存储加密信息。 这是否意味着他们不在服务器端存储用于 AES 解密的任何密钥或 IV 或盐? 据我所知,如果我在同一台设备上加密和解密可能没问题,但我在电脑上使用Lasspass添加密码,但我可以在手机上看到密码phone。 他们如何在手机上解密 phone? 手机 phone 应该没有用于计算机端加密的密钥和 IV 和盐,不是吗?

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

真正安全的"Local-Only Encryption Model"应该如何实现? 有人可以给我一些指导吗? 感谢您的帮助。

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

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

假设我们有一个为我们存储二进制数据的服务器,而且,它以 user/account 为基础...

我们需要什么才能授权帐户功能,例如 "replace data" 或 "request stored data"?

我们需要一个必须由证明客户端身份的客户端解决的任务,换句话说,当且仅当客户端持有特定秘密时才能解决的操作...这个为非对称加密尖叫 and/or 数字签名 ... 密钥对 ...

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

一个可能的解决方案非常简单,从... PBKDF2 ...密码派生密钥派生函数开始

PBKDF2 接受一个密码、一个盐、一个轮数参数,并给你...位...伪随机位

获取您的用户名并对其进行哈希处理...=> 完美的盐...
取一个任意数字,例如 15000 => 你的轮数(较大的数字会减慢计算过程 -> 减慢暴力攻击,而你每次登录只需要计算一次)
记下你的密码 => 惊喜...一个密码

运行 PBKDF2

使用生成的比特流中的几个字节为您最喜欢的 CSPRNG(加密安全伪随机数生成器)播种

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

使用密钥

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

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

但现在你有来自密码的非对称加密...

服务器存储 public 密钥 ... 并且只要求客户端解密一个数字(随机数)以及对 replace/retrieve 数据的请求... 能够解密随机数证明密钥为客户端所知

您还可以从 PBKDF2 流派生出一个 AES 密钥来加密您的密码数据库,然后再将其发送到服务器……或者在收到密码后进行解密