如何使用GunDB从其他用户那里获取解密数据

时间:2019-06-21 00:53:43

标签: gun gundb

虽然我尝试使用gun.user的.secret().trust(),但结果出乎意料。我如何从其他用户那里获取数据,以便在应用程序中进行访问控制? 以及我需要知道如何解密数据,而不会出现错误消息“无法解密”。

  • 节点10.16.0
  • 枪0.2019.515
  • chrome 74.0.3729.169

左右分别有User03和User01。 我的测试目标是User01,以获取User03的机密数据。

1。将数据放在User03下,并在两个控制台上检查数据。

S.user.get('test').put('come on'); // on left console as user03

S.user.get('test').once(console.log); // on left console as user03
user03.get('test').once(console.log); // on right console as user01

put and check

2。让User03 .trust() User01位于左侧。

S.user.get('test').trust( user01 ); // left

trust

3。使用User03的配对来创建User03的数据secret

S.user.get('test').secret( S.user.pair ); //left

secret

4。检查双方的加密数据。

S.user.get('test').once(console.log); // on left console as user03
user03.get('test').once(console.log); // on right console as user01

check secret

5。使用右侧的user01对来解密user03的秘密。

它收到错误消息,“无法解密”。

user03.get('test').once((data)=>{
    SEA.decrypt(data, S.user.pair, console.log);
});; // right

6。检查STEP 5的返回对象内部。

我希望输出作为解密的数据“出现”。

1 个答案:

答案 0 :(得分:0)

@huhsame,很抱歉延迟回答此问题。 (对于紧急情况,请在Twitter或Gitter中为我加标签)

主要问题是User.trustUser.secret当前(2019年8月)是不稳定的alpha API方法。

但是,我们有一个稳定的,可用于生产的底层API,您可以使用SEA

以下是如何完成您想做的事情的完整示例:

var alice = await SEA.pair();
var bob = await SEA.pair();
var enc = await SEA.encrypt('shared data', await SEA.secret(bob.epub, alice));
await SEA.decrypt(enc, await SEA.secret(alice.epub, bob));

这是GUN和User API方法在下面使用的方式。

您会发现alicebob在您可能已经完成的gun.user(ecdsaPubKey)查找之后是相同的密钥对(ECDSA和ECDH的发布和私有)。

await SEA.secret(ecdhPubKey, alice)在目标用户的公共密钥(他们的ECDH公开密钥,而不是ECDSA)和“您自己”(爱丽丝)之间获得一个公共共享密钥。用mixing colors著名地描述了如何做到这一点。

然后.encrypt(.decrypt(会执行您期望的操作,只要它们具有相同的“密码”(第二个参数)即可,这是通过推导公用secret获得的的两个用户,即使在相反的方向也能提供相同的输出(目标用户Bob,将其密钥对作为“ you”传递,而Alice的ECDH pubkey作为第一个参数传递给secret)。

希望这可以为您节省时间,自己动手做,直到User.trustUser.secret(与已经工作的SEA.secret相比)更高级的便捷方法准备就绪为止。