如果客户端只有一个会话 ID 要在请求中发送到服务器,如何将解密的用户数据提供给客户端?

How to serve decrypted user data to a client if the client only has a session ID to be sent in a request to the server?

简而言之,当用户只有一个会话 ID 与请求一起发送到服务器时,我如何解密根据客户端向服务器请求使用用户密码加密的用户内容?

我是否让客户端像会话 ID 一样存储用户密码,以便它可以与请求一起发送,这样服务器就可以使用它来解密用户的内容?

我真的不知道它应该如何工作,例如,Standard Notes,你输入一次你的凭据,然后你可以做你想要的尽可能多的笔记,这些笔记可能会存储在他们的服务器经过加密,并与登录到您的 Standard Notes 帐户并解密的其他设备同步。也就是说,我不必每次都输入密码来保存笔记,或获取所有解密的笔记。

我的猜测是服务器实际上并没有解密数据,而是将加密后的数据发送给客户端,客户端在本地存储密码,并在客户端本地解密数据?如果是这样,那么我如何在客户端存储密码?

(从技术上讲,这是一个一般的抽象问题,但作为参考,我正在尝试使用 Node.js 服务器来实现这一点,其中(加密的)用户内容存储在 JSON 文件中.)

编辑:基本上,从答案和其他人那里我了解到我对加密密钥的理解是错误的。所以。是的。所以这个问题也有点不对。

My guess would be that the server actually doesn't decrypt the data, but rather sends the encrypted data to the client, where the client locally stores the password, and decrypts the data locally, in the client? If that's the case, how do I store the password in the client then?

这是完全正确的。服务器不应该能够解密数据,除非它们有特殊需要。密码存储在用户的密码管理器中,否则存储在他们的大脑中。

加密密钥要么从密码派生(例如使用 PBKDF2 或 scrypt),要么是随机的并使用密码派生密钥加密。

存储这些密钥取决于您的客户端系统。理想情况下,它将与系统的安全密钥存储(例如 Mac Keychain、Windows PasswordVault 或 Android Keystore)集成,但具体取决于您的客户端的实现方式。