security - 在没有服务器端解密的情况下在用户之间共享加密的秘密
问题描述
是否可以在几个(动态计数)用户之间共享加密数据而无需在服务器端解密?
例如:
- 我们有秘密管理后端
- 用户 A 创建一个秘密,以某种方式对其进行加密并发送到服务器进行存储
- 用户 A 想要将访问此密钥的权限授予用户 B
- 用户 B 现在可以从服务器获取秘密,但是......
他们如何解密这个秘密?
这是我现在的一个想法:
做2个后端:
- 一种用于存储加密数据和管理用户之间的访问
- 另一种用于存储解密数据的公钥
这是我在这里关心的问题:
服务器所有者可以获得公钥,获取加密数据并解密该数据。当服务器不知道哪个密钥解密数据时,我看不到任何在用户之间管理(包括共享公钥)的方法。
也许有人知道 lastpass、passbolt 或任何其他服务如何解决这个问题?
解决方案
您似乎对公钥和私钥的工作方式有误解。
对于给定的公钥/私钥对,任何人都可以使用公钥加密数据,但只有私钥的所有者才能解密数据。
所以要在用户之间传递数据,每个用户首先应该:
- 创建公钥/私钥对
- 将他们的公钥上传到服务器
如果用户 A 想向用户 B 发送数据,他们将执行以下操作:
- 从服务器拉取用户 B 的公钥
- 使用 B 的公钥加密数据
- 将加密数据上传到服务器。
服务器现在持有加密数据,但它无法解密它,因为它没有 B 的私钥,而只有公钥。
用户 B 现在可以从服务器中提取加密数据并使用他们的私钥对其进行解密。
请注意,这仅涉及加密。它不涉及身份验证问题,即确保数据来自已知来源。
通过从受信任的机构颁发每个用户的公钥上的证书并将每个用户的证书存储在服务器上,并让用户对他们使用他们的私钥加密的消息应用数字签名,可以使该方案更加安全。然后消息的接收者可以使用发送者的公钥和证书来验证签名。
推荐阅读
- google-sheets - 如何按总和将谷歌工作表范围分成几部分
- css - 使css网格响应,如果浏览器字体大小改变
- reactjs - 如何控制antd中的时间选择器列表?
- java - SAKAI 无法部署到 TOMCAT
- php - PHP 函数的返回和回显工作方式不同。为什么?
- spring - Nginx HTTPS->HTTP 在 Spring 中出现 403“需要 SSL”错误
- django - Django:如何获取与登录用户相关的所有数据
- git - 我们如何在 Azure DevOps 构建管道中读取 GIT 提交消息?
- laravel - POST:来自 Laravel 中 Messenger Bot 的 500 内部服务器错误
- python - OpenCV RBG2HSV 转换与 float32 图像的差异