首页 > 解决方案 > 如何在 Electron App 中安全、正确地存储 JWT 令牌

问题描述

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

我试过使用node-keytar包,它使用从用户登录中派生的加密密钥。

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

node-keytar 的代码相当简单,这里是 add secret

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

这是获取的秘密

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

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

标签: jwtelectron

解决方案


在许多涉及 JWT 的用例中,您不必在将 JWT 发送到 API 之前对其进行任何额外的加密/混淆,因为:

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

所以一般来说,JWT 模式是一种将服务器端会话状态推送到应用程序之外的方式。它以这样一种方式做到这一点,即这种状态不受外界篡改。如果可以轻松在外部篡改 JWT,那么整个模式就会分崩离析。


推荐阅读