如何使用Virgil安全性对消息进行加密和解密?

时间:2018-07-31 06:09:12

标签: encryption private-key public-key

我正在尝试将Virgil安全性集成到我的基本聊天应用程序中,但是并不需要。

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

2 个答案:

答案 0 :(得分:2)

我是维吉尔的点心。让我帮您解决这个用例。

我准备了一些其他信息:

Virgil Simple JS演示中的步骤1和2(您已经看过)

步骤1。用户注册步骤。

users register their Public Keys

在此步骤:

  • 您对爱丽丝进行身份验证
  • 成功验证Alice的身份后,您给她一个JWT,以授予她对Virgil的Cloud API的访问权限
  • 爱丽丝生成她的私钥(2)->将其私钥存储到本地存储中->创建她的维吉尔卡
  • 爱丽丝在维吉尔卡服务中心发布(3)她的维吉尔卡(她使用JWT来完成)。
  • 然后您对Bob(用户B)进行身份验证:与Alice的故事相同。

最后,爱丽丝和鲍勃拥有自己的私钥和维吉尔卡(公钥已发布到我们的云中,供用户查找彼此的公钥)。

步骤2。简单交流(聊天)。

Simple e2e encrypted communication

在此步骤:

  • 爱丽丝在维吉尔卡服务(1)处寻找并找到鲍勃的公钥
  • Alice从浏览器的本地存储中加载了她的私钥
  • Alice(使用她的私钥)签名并加密(使用Bob的公钥)消息,并通过您的Application Server发送给Bob
  • 鲍勃收到加密并签名的消息
  • 鲍勃去卡服务中心寻找爱丽丝的公钥,以验证她的签名
  • Bob从本地存储中加载其私钥并解密消息

结果,Bob验证了Alice的签名并解密了来自Alice的邮件。

现在,遇到问题:爱丽丝决定使用其他浏览器(或设备B),但是她无法在新设备上加密鲍勃的先前消息。

解决方案:,您应该将其先前的私钥从设备A传​​输到设备B。以最安全的方式执行此操作:

  • 用于使用一些附加密钥对设备A上的私钥进行加密。
  • 将加密的私钥传输到设备B。
  • 在设备B上使用相同的附加秘密密钥从设备A解密加密的私钥。

因此,如您所见,您必须在两个设备上都使用一些特殊的附加密钥(某些使者使用设备之间的QR码进行此操作)才能安全地执行此操作。为了简化起见,我们为您提供了一种特殊的技术,您可以生成“附加密钥”,这在两个设备上都是相同的。我们称该秘密密钥为大脑密钥。 脑密钥-基于爱丽丝的密码的强密码非对称密钥。

您可以在这里找到有关此键的更多信息:https://developer.virgilsecurity.com/docs/java/use-cases/v1/brainkey

现在,让我们看一下下一步。

步骤3。将您的私钥存储在云中

store somewhere encrypted Private Key

在此步骤:

  • 爱丽丝输入她的密码
  • 爱丽丝从她的密码(1)生成一个Brain Key
  • Alice用大脑密钥(2)加密了她的私钥
  • Alice将她的加密私钥上传到Cloud中的某个地方(到应用程序的后端/数据库)

结果,爱丽丝将把自己用来与鲍勃聊天的加密私钥存储在云中。

步骤4。爱丽丝现在使用她的新浏览器(或新设备)

transmit a Private Key

在此步骤:

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

结果,爱丽丝将在设备B上获取她的私钥,该私钥是她以前在设备A上与鲍勃聊天的方式。这种聊天对话在她的设备更改后仍然存在。 >

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

答案 1 :(得分:1)

维吉尔的大卫。感谢您的提问,也很抱歉让您感到困惑。

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

为了使该应用正常运行,即为了使您的用户能够从其他浏览器登录并解密消息,他们需要从一个中央位置检索他们尊敬的私钥。现在,建议将用户私钥保存到数据库(并允许其他人访问它并解密用户的消息)对我来说太la脚了,因此我们创建了一种称为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

大卫