虽然我尝试使用gun.user的.secret()
和.trust()
,但结果出乎意料。我如何从其他用户那里获取数据,以便在应用程序中进行访问控制?
以及我需要知道如何解密数据,而不会出现错误消息“无法解密”。
左右分别有User03和User01。 我的测试目标是User01,以获取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
.trust()
User01位于左侧。S.user.get('test').trust( user01 ); // left
secret
。S.user.get('test').secret( S.user.pair ); //left
S.user.get('test').once(console.log); // on left console as user03
user03.get('test').once(console.log); // on right console as user01
它收到错误消息,“无法解密”。
user03.get('test').once((data)=>{
SEA.decrypt(data, S.user.pair, console.log);
});; // right
我希望输出作为解密的数据“出现”。
答案 0 :(得分:0)
@huhsame,很抱歉延迟回答此问题。 (对于紧急情况,请在Twitter或Gitter中为我加标签)
主要问题是User.trust
和User.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方法在下面使用的方式。
您会发现alice
和bob
在您可能已经完成的gun.user(ecdsaPubKey)
查找之后是相同的密钥对(ECDSA和ECDH的发布和私有)。
await SEA.secret(ecdhPubKey, alice)
在目标用户的公共密钥(他们的ECDH公开密钥,而不是ECDSA)和“您自己”(爱丽丝)之间获得一个公共共享密钥。用mixing colors著名地描述了如何做到这一点。
然后.encrypt(
和.decrypt(
会执行您期望的操作,只要它们具有相同的“密码”(第二个参数)即可,这是通过推导公用secret
获得的的两个用户,即使在相反的方向也能提供相同的输出(目标用户Bob,将其密钥对作为“ you”传递,而Alice的ECDH pubkey作为第一个参数传递给secret
)。
希望这可以为您节省时间,自己动手做,直到User.trust
和User.secret
(与已经工作的SEA.secret
相比)更高级的便捷方法准备就绪为止。