如何在Electron App中安全正确地存储JWT令牌

时间:2019-05-23 14:50:46

标签: jwt electron

我正在构建一个电子桌面应用程序,在该应用程序中它将使用JWT令牌调用远程API。但是,在没有XSS,CSRF,中间人攻击等威胁的情况下,我应该在何处安全地保留此JWT令牌,并且其他应用程序无法访问

我尝试使用node-keytar程序包,该程序包使用从用户登录名中派生的加密密钥。

但是根据这个问题(https://github.com/atom/node-keytar/issues/88),如果用户的环境安装了恶意软件,则凭据(在我们的场景中为JWT)仍然会受到威胁。

node-keytar的代码非常简单,这是添加的秘密

keytar.addPassword('KeytarTest', 'AccountName', 'secret');

这是获取秘密

const secret = keytar.getPassword('KeytarTest', 'AccountName');
console.log(secret); // "supersecret"

我正在考虑仅将JWT存储到内存中是最安全的方法,但是它将要求用户在每次重新打开电子桌面应用程序时重新登录并获取JWT令牌。 任何建议或想法都受到欢迎。谢谢!

1 个答案:

答案 0 :(得分:0)

在许多涉及JWT的用例中,您不必在将JWT发送到API之前对JWT进行任何其他的加密/模糊处理,因为:

  • 将JWT发送到API时,您将通过SSL或HTTPS(对整个有效负载进行加密)进行操作。从理论上讲,这将消除中间人攻击的大多数机会。
  • 即使有人设法嗅探您的JWT令牌,他们也将缺少解锁它所需的服务器密钥。同样,即使他们设法解锁JWT,也几乎不可能在不更改JWT本身包含的校验和的情况下更改其内容。通过在JWT中插入一些东西,消除了注入攻击的机会。

因此,一般而言,JWT模式是将服务器端会话状态推送到应用程序外部的一种方式。并以保护此状态免受外部篡改的方式进行操作。如果可以轻松地在外部篡改JWT,则整个模式将崩溃。