【问题标题】:How to encrypt and decrypt messages using Virgil security?如何使用 Virgil 安全加密和解密消息?
【发布时间】:2019-01-07 10:35:44
【问题描述】:

我正在尝试将 Virgil 安全性集成到我的基本聊天应用程序中,但没有必要。

在聊天时,两个用户说 A 和 B。两个用户都登录并在他们之间进行了一些交流后。现在两个用户都重新加载/注销或登录,然后发送的旧消息无法解密,因为将生成新的私钥。 我不想将用户的公钥和私钥存储在数据库或本地存储中。

【问题讨论】:

    标签: encryption private-key public-key


    【解决方案1】:

    我是来自 Virgil 的 Dim。让我帮你解决这个用例。

    我准备了一些额外的信息:

    Virgil Simple JS Demo 中的第 1 步和第 2 步(你已经看过了)

    第 1 步。用户注册步骤。

    users register their Public Keys

    在这一步:

    • 您对 Alice 进行身份验证
    • 成功验证 Alice 后,您向她提供 JWT 以授予她对 Virgil 的 Cloud API 的访问权限
    • Alice 生成她的私钥 (2) -> 将她的私钥存储到本地存储中 -> 创建她的 Virgil 卡
    • Alice 在 Virgil Cards Service 上发布 (3) 她的 Virgil Card(她使用她的 JWT 来做这件事)。
    • 然后您对 Bob(用户 B)进行身份验证:与 Alice 相同。

    最后,Alice 和 Bob 拥有自己的私钥和 Virgil 卡(公钥发布到我们的云中,供用户查找彼此的公钥)。

    第 2 步。简单的交流(聊天)。

    Simple e2e encrypted communication

    在这一步:

    • Alice 在 Virgil Cards Service 寻找并找到 Bob 的公钥 (1)
    • Alice 从浏览器的本地存储中加载她的私钥
    • Alice 签署(使用她的私钥)并加密(使用 Bob 的公钥)一条消息并通过您的应用服务器发送给 Bob
    • Bob 收到加密和签名的消息
    • Bob 前往 Cards Service 查找 Alice 的公钥以验证她的签名
    • 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

    在这一步:

    • Alice 输入她的密码
    • Alice 从她的密码中生成了一个 Brain Key (1)
    • Alice 使用 Brain Key (2) 加密她的私钥
    • Alice 将她的加密私钥上传到云端某处(到您应用的后端/数据库)

    因此,Alice 将在云端拥有她用来与 Bob 聊天的加密私钥。

    第 4 步。 Alice 现在使用她的新浏览器(或新设备)

    transmit a Private Key

    在这一步:

    • Alice 输入她的密码(与她之前用于生成 Brain Key 的密码相同)。
    • 这会生成她的大脑钥匙 (1)
    • Alice 从云端/从您的后端/数据库下载她的加密私钥 (2)
    • Alice 使用 Brain Key 解密加密的私钥

    因此,Alice 将在设备 B 上获得她的私钥,她曾经在设备 A 上与 Bob 聊天。这样,聊天对话在她更换设备后仍然存在。

    每次 Alice 使用新设备时,她都可以重新生成相同的 Brain Key 并轻松获得她的私钥,这是她在所有设备上用来与 Bob 聊天的密钥。

    【讨论】:

      【解决方案2】:

      来自 Virgil 的大卫在这里。感谢您的提问,很抱歉让您感到困惑。

      我认为问题在于:虽然示例应用为 Alice 和 Bob 生成了用户私钥和公钥,并将公钥发布到我们的 Cards 服务,但它并没有将私钥保存在任何地方。因此,私钥保留在浏览器的本地存储中,因此不会同步到您的用户接下来登录的其他浏览器/设备。因此,由于缺少私钥,您的用户无法解密他们的消息...这是示例应用的限制,我们应该尽快修复该问题(已创建任务)。

      为了让应用程序正常工作,即使您的用户能够从另一个浏览器登录并解密消息,他们需要从一个中心位置检索他们尊重的私钥。现在,我不建议只将用户私钥保存到您的数据库(并允许其他人访问它+解密您用户的消息),所以我们创建了一种名为 BrainKey 的技术来加密用户私钥使用我们从用户密码中派生的密钥。 Apple 使用您的 TouchID 派生密钥加密您的钥匙串的类似方法。

      这是您需要执行的操作:

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

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

      3. 从 BrainKey 生成公钥并加密用户之前(步骤 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 安全提供的任何其他机制吗?请告诉我。
      • 是的,有一个解决方案,您可以尝试我们的新技术,称为 BrainKey developer.virgilsecurity.com/docs/java/use-cases/v1/brainkey
      • 我正在用 JavaScript 构建我的应用程序
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-01
      • 2021-07-04
      • 2023-03-05
      • 1970-01-01
      • 2020-08-05
      • 1970-01-01
      相关资源
      最近更新 更多