如何使用 Virgil 安全加密和解密消息?
How to encrypt and decrypt messages using Virgil security?
我正在尝试将 Virgil 安全性集成到我的基本聊天应用程序中,但无法满足需要。
聊天时,2个用户说A和B。两个用户都登录后,他们之间进行了一些交流。现在两个用户 reload/logged 退出或登录然后发送旧消息无法解密,因为将生成新的私钥。
我不想将 public 和用户的私钥存储在数据库或本地存储中。
维吉尔的大卫在这里。感谢您的提问,抱歉让您感到困惑。
我认为问题是:虽然示例应用程序为 Alice 和 Bob 生成了用户私有密钥和 public 密钥,并向我们的 Cards 服务发布了 public 密钥,但它没有保存任何地方的私钥。因此,私钥保留在浏览器的本地存储中,因此不会同步到您的用户接下来登录的其他 browsers/devices。因此,由于缺少私钥,您的用户无法解密他们的消息...这是示例应用程序的一个限制,我们应该尽快修复该问题(已创建任务)。
为了让应用程序正常运行,即为了让您的用户能够从另一个浏览器登录并解密消息,他们需要从中央位置检索他们的私钥。现在,我建议只将用户私钥保存到您的数据库(并允许其他人访问它+解密您用户的消息),这对我来说太蹩脚了,所以我们创建了一种名为 BrainKey 的技术来加密用户私钥使用我们从用户密码派生的密钥。 Apple 使用您的 TouchID 派生密钥来加密您的钥匙串的方式类似。
这是你需要做的才能让它发挥作用:
在用户注册期间(在客户端设备上),为您的用户生成私钥并将 public 密钥发布到我们的卡片服务。
然后使用用户密码生成一个BrainKey(技术上是私钥)。
从 BrainKey 生成 public 密钥并加密用户之前(步骤 1)生成的私钥。
现在,为用户将这个加密的私钥保存到您的数据库中。
每次您的用户使用她的密码登录时,从她的密码重新生成相同的 BrainKey,从您的数据库下载加密的私钥,用 BrainKey 解密,现在您可以使用此密钥解密所有发送给她的聊天消息。
这是我们 BrainKey 技术的参考和示例代码:https://developer.virgilsecurity.com/docs/javascript/use-cases/v1/brainkey
有道理吗?您想查看执行此操作的示例代码吗?如果你加入我们的 Slack,我们可以实时聊天,我是@dave: https://join.slack.com/t/virgilsecurity/shared_invite/enQtMjg4MDE4ODM3ODA4LTc2OWQwOTQ3YjNhNTQ0ZjJiZDc2NjkzYjYxNTI0YzhmNTY2ZDliMGJjYWQ5YmZiOGU5ZWEzNmJiMWZhYWVmYTM
大卫
我来自 Virgil。让我来帮助您解决这个用例。
我准备了一些补充资料:
Virgil 简单 JS 演示中的第 1 步和第 2 步(您已经看过)
步骤#1。用户注册步骤.
users register their Public Keys
在这一步:
- 您验证爱丽丝
- 成功验证 Alice 后,您给她一个 JWT 以授予她访问 Virgil 的云 API 的权限
- Alice 生成她的私钥 (2) -> 将她的私钥存储到本地存储 -> 创建她的 Virgil 卡
- Alice 在 Virgil Cards Service 上发布 (3) 她的 Virgil Card(她使用她的 JWT 来做)。
- 然后您对 Bob(用户 B)进行身份验证:与 Alice 相同。
最后,Alice 和 Bob 拥有自己的私钥和 Virgil 卡(Public 密钥发布到我们的云端,供用户找到彼此的 Public 密钥)。
步骤#2。简单的交流(聊天)。
Simple e2e encrypted communication
在这一步:
- Alice 在 Virgil Cards Service (1)
寻找并找到 Bob 的 Public 钥匙
- 爱丽丝在浏览器中从她的本地存储加载她的私钥
- Alice 签名(使用她的私钥)并加密(使用 Bob 的 Public 密钥)消息并通过您的应用程序服务器发送给 Bob
- Bob 收到加密和签名的消息
- Bob 去 Cards Service 寻找 Alice 的 Public 密钥以验证她的签名
- Bob 从他的本地存储加载他的私钥并解密消息
结果,Bob验证了Alice的签名并解密了来自Alice的消息。
现在,问题来了:Alice 决定使用另一个浏览器(或设备 B),但她无法在新设备上加密 Bob 之前的消息。
解决方案:您应该将她以前的私钥从设备 A 传输到设备 B。以最安全的方式执行此操作:
- 是用一些额外的密钥加密设备 A 上的私钥。
- 将加密的私钥传输到设备 B。
- 在设备 B 上使用相同的附加密钥来解密来自设备 A 的加密私钥。
因此,如您所见,您必须在两台设备上使用一些特殊的附加密钥(一些信使使用设备之间的 QR 码执行此操作)才能安全地进行操作。不过,为了更简单,我们为您提供了一项特殊技术,可以生成在两台设备上都相同的“附加密钥”。我们称之为秘密钥匙——大脑钥匙。 Brain Key - 基于 Alice 密码的强加密非对称密钥。
您可以在此处找到有关此密钥的更多信息:https://developer.virgilsecurity.com/docs/java/use-cases/v1/brainkey
那么现在,让我们来看看下一步。
步骤#3。将您的私钥存储在云端
store somewhere encrypted Private Key
在这一步:
- 爱丽丝输入她的密码
- 爱丽丝根据她的密码生成了一个 Brain Key (1)
- 爱丽丝用大脑密钥 (2) 加密她的私钥
- 爱丽丝将她加密的私钥上传到云中的某个地方(到您应用的 backend/database)
结果,Alice 将在云中拥有她用来与 Bob 聊天的加密私钥。
步骤#4。 Alice 现在使用她的新浏览器(或新设备)
transmit a Private Key
在这一步:
- 爱丽丝输入她的密码(与她之前用于生成大脑密钥的密码相同)。
- 这会生成她的大脑密钥 (1)
- Alice 从云端/从您的 backend/database (2)
下载她的加密私钥
- 爱丽丝用大脑密钥解密加密的私钥
结果,Alice 将在设备 B 上获得她的私钥,她曾在设备 A 上与 Bob 聊天。这样,聊天对话就保存了下来设备更改。
每次 Alice 使用新设备时,她都可以重新生成相同的 Brain Key 并轻松获得她的 Private Key,这是她在所有设备上用来与 Bob 聊天的密钥。
我正在尝试将 Virgil 安全性集成到我的基本聊天应用程序中,但无法满足需要。
聊天时,2个用户说A和B。两个用户都登录后,他们之间进行了一些交流。现在两个用户 reload/logged 退出或登录然后发送旧消息无法解密,因为将生成新的私钥。 我不想将 public 和用户的私钥存储在数据库或本地存储中。
维吉尔的大卫在这里。感谢您的提问,抱歉让您感到困惑。
我认为问题是:虽然示例应用程序为 Alice 和 Bob 生成了用户私有密钥和 public 密钥,并向我们的 Cards 服务发布了 public 密钥,但它没有保存任何地方的私钥。因此,私钥保留在浏览器的本地存储中,因此不会同步到您的用户接下来登录的其他 browsers/devices。因此,由于缺少私钥,您的用户无法解密他们的消息...这是示例应用程序的一个限制,我们应该尽快修复该问题(已创建任务)。
为了让应用程序正常运行,即为了让您的用户能够从另一个浏览器登录并解密消息,他们需要从中央位置检索他们的私钥。现在,我建议只将用户私钥保存到您的数据库(并允许其他人访问它+解密您用户的消息),这对我来说太蹩脚了,所以我们创建了一种名为 BrainKey 的技术来加密用户私钥使用我们从用户密码派生的密钥。 Apple 使用您的 TouchID 派生密钥来加密您的钥匙串的方式类似。
这是你需要做的才能让它发挥作用:
在用户注册期间(在客户端设备上),为您的用户生成私钥并将 public 密钥发布到我们的卡片服务。
然后使用用户密码生成一个BrainKey(技术上是私钥)。
从 BrainKey 生成 public 密钥并加密用户之前(步骤 1)生成的私钥。
现在,为用户将这个加密的私钥保存到您的数据库中。
每次您的用户使用她的密码登录时,从她的密码重新生成相同的 BrainKey,从您的数据库下载加密的私钥,用 BrainKey 解密,现在您可以使用此密钥解密所有发送给她的聊天消息。
这是我们 BrainKey 技术的参考和示例代码:https://developer.virgilsecurity.com/docs/javascript/use-cases/v1/brainkey
有道理吗?您想查看执行此操作的示例代码吗?如果你加入我们的 Slack,我们可以实时聊天,我是@dave: https://join.slack.com/t/virgilsecurity/shared_invite/enQtMjg4MDE4ODM3ODA4LTc2OWQwOTQ3YjNhNTQ0ZjJiZDc2NjkzYjYxNTI0YzhmNTY2ZDliMGJjYWQ5YmZiOGU5ZWEzNmJiMWZhYWVmYTM
大卫
我来自 Virgil。让我来帮助您解决这个用例。
我准备了一些补充资料:
Virgil 简单 JS 演示中的第 1 步和第 2 步(您已经看过)
步骤#1。用户注册步骤.
users register their Public Keys
在这一步:
- 您验证爱丽丝
- 成功验证 Alice 后,您给她一个 JWT 以授予她访问 Virgil 的云 API 的权限
- Alice 生成她的私钥 (2) -> 将她的私钥存储到本地存储 -> 创建她的 Virgil 卡
- Alice 在 Virgil Cards Service 上发布 (3) 她的 Virgil Card(她使用她的 JWT 来做)。
- 然后您对 Bob(用户 B)进行身份验证:与 Alice 相同。
最后,Alice 和 Bob 拥有自己的私钥和 Virgil 卡(Public 密钥发布到我们的云端,供用户找到彼此的 Public 密钥)。
步骤#2。简单的交流(聊天)。
Simple e2e encrypted communication
在这一步:
- Alice 在 Virgil Cards Service (1) 寻找并找到 Bob 的 Public 钥匙
- 爱丽丝在浏览器中从她的本地存储加载她的私钥
- Alice 签名(使用她的私钥)并加密(使用 Bob 的 Public 密钥)消息并通过您的应用程序服务器发送给 Bob
- Bob 收到加密和签名的消息
- Bob 去 Cards Service 寻找 Alice 的 Public 密钥以验证她的签名
- Bob 从他的本地存储加载他的私钥并解密消息
结果,Bob验证了Alice的签名并解密了来自Alice的消息。
现在,问题来了:Alice 决定使用另一个浏览器(或设备 B),但她无法在新设备上加密 Bob 之前的消息。
解决方案:您应该将她以前的私钥从设备 A 传输到设备 B。以最安全的方式执行此操作:
- 是用一些额外的密钥加密设备 A 上的私钥。
- 将加密的私钥传输到设备 B。
- 在设备 B 上使用相同的附加密钥来解密来自设备 A 的加密私钥。
因此,如您所见,您必须在两台设备上使用一些特殊的附加密钥(一些信使使用设备之间的 QR 码执行此操作)才能安全地进行操作。不过,为了更简单,我们为您提供了一项特殊技术,可以生成在两台设备上都相同的“附加密钥”。我们称之为秘密钥匙——大脑钥匙。 Brain Key - 基于 Alice 密码的强加密非对称密钥。
您可以在此处找到有关此密钥的更多信息:https://developer.virgilsecurity.com/docs/java/use-cases/v1/brainkey
那么现在,让我们来看看下一步。
步骤#3。将您的私钥存储在云端
store somewhere encrypted Private Key
在这一步:
- 爱丽丝输入她的密码
- 爱丽丝根据她的密码生成了一个 Brain Key (1)
- 爱丽丝用大脑密钥 (2) 加密她的私钥
- 爱丽丝将她加密的私钥上传到云中的某个地方(到您应用的 backend/database)
结果,Alice 将在云中拥有她用来与 Bob 聊天的加密私钥。
步骤#4。 Alice 现在使用她的新浏览器(或新设备)
transmit a Private Key
在这一步:
- 爱丽丝输入她的密码(与她之前用于生成大脑密钥的密码相同)。
- 这会生成她的大脑密钥 (1)
- Alice 从云端/从您的 backend/database (2) 下载她的加密私钥
- 爱丽丝用大脑密钥解密加密的私钥
结果,Alice 将在设备 B 上获得她的私钥,她曾在设备 A 上与 Bob 聊天。这样,聊天对话就保存了下来设备更改。
每次 Alice 使用新设备时,她都可以重新生成相同的 Brain Key 并轻松获得她的 Private Key,这是她在所有设备上用来与 Bob 聊天的密钥。