如何使用 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 派生密钥来加密您的钥匙串的方式类似。

这是你需要做的才能让它发挥作用:

  1. 在用户注册期间(在客户端设备上),为您的用户生成私钥并将 public 密钥发布到我们的卡片服务。

  2. 然后使用用户密码生成一个BrainKey(技术上是私钥)。

  3. 从 BrainKey 生成 public 密钥并加密用户之前(步骤 1)生成的私钥。

  4. 现在,为用户将这个加密的私钥保存到您的数据库中。

每次您的用户使用她的密码登录时,从她的密码重新生成相同的 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 聊天的密钥。