jwt - 如何在 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 令牌。欢迎任何建议或想法。谢谢!
解决方案
在许多涉及 JWT 的用例中,您不必在将 JWT 发送到 API 之前对其进行任何额外的加密/混淆,因为:
- 当您将 JWT 发送到 API 时,您将通过 SSL 或 HTTPS 执行此操作,这会加密整个有效负载。从理论上讲,这将消除大多数中间人攻击的机会。
- 即使有人设法嗅探您的 JWT 令牌,他们也会缺少解锁它所需的服务器密钥。此外,即使他们设法解锁了 JWT,也几乎不可能在不更改校验和的情况下更改其内容,校验和包含在 JWT 本身中。这通过在 JWT 中插入一些东西来消除注入攻击的机会。
所以一般来说,JWT 模式是一种将服务器端会话状态推送到应用程序之外的方式。它以这样一种方式做到这一点,即这种状态不受外界篡改。如果可以轻松地在外部篡改 JWT,那么整个模式就会分崩离析。
推荐阅读
- css - 具有边框半径的 Safari CSS 转换
- json - 有没有办法在其他单元格或行中批量显示谷歌表格链接弹出预览信息?
- swift - 迅速。WebKit 的自定义字体
- android - 单击搜索按钮时如何防止自动扩展搜索视图?
- python - 在 numpy 而不是 tensorflow 中计算 keras 度量
- javascript - Pure(Vanilla) Javascipt 同步设置过渡和样式,它没有按我想要的方式表现
- google-api - 仅使用 API 以编程方式访问 Google 数据洞察报告?
- java - 在 docker-compose.yml 环境中编写一个 cron 表达式
- javascript - 从对象中删除包含字符串的数据
- sql - 如何从 PSQL 函数中获取分组表?