在 JWT 中存储秘密信息,使用 Node.js - Express 后端

Posted

技术标签:

【中文标题】在 JWT 中存储秘密信息,使用 Node.js - Express 后端【英文标题】:Storing secret info in JWT, using Node.js - Express backend 【发布时间】:2017-10-14 04:56:57 【问题描述】:

我正在开发一个 Angular Web 应用程序,它通过 RESTful API 与其后端进行通信。目前我正在使用 JWT 来存储状态(当前用户 ID 等)。我使用 jsonwebtoken 和 passport-jwt 包在我的 Node.js-Express 应用程序中实现 JWT。

有时我可能需要在状态中存储一些与会话相关但用户不应该知道的信息(例如,秘密加密密钥)。

由于 JWT 有效负载已签名但未加密,因此任何想要对其进行解码的人都可以清楚地看到其内容,因此不适合将机密内容直接存储在有效负载中。虽然我可以对整个 JWT 字符串或仅在负载中的秘密变量值实施某种自制加密,但我正在寻找“正确”或“传统”的方式来处理这个问题。

【问题讨论】:

【参考方案1】:

最好的方法是仅将其存储在后端的某种持久存储中,最好是散列。

如果这不可能,那么您可以将数据存储在 JWT 中,但您需要在将数据放入其中之前对其进行加密。

Bcrypt 可能是仍然安全的最简单的解决方案是https://www.npmjs.com/package/bcryptjs。请注意,您希望它越安全,加密速度就越慢。

【讨论】:

bcrypt 不只是作为一种散列方法有用,而不是作为一种加密方法吗?似乎OP需要不同的解决方案。我想知道“不应该知道”的部分——如果用户发现了这些信息会有危险吗? 具体示例是两因素身份验证,其中代码基于在服务器端生成并通过其他媒体(例如短信)传递给用户的秘密种子。这段数据必须保存在状态中,但不应在 API 通信中观察到。

以上是关于在 JWT 中存储秘密信息,使用 Node.js - Express 后端的主要内容,如果未能解决你的问题,请参考以下文章

为啥使用 JWT 而不是在 DB 中存储令牌来授权 Node.js 中的访问令牌?

使用 JWT (Node.js + mongoose) 在 REST API 中管理用户权限的最佳方法

httpOnly cookie 中的 JWT - AuthGuard 和受保护的路由(Node.js、Angular)

从 PHP 向 Node.js 发送请求

讨论:本地存储中 Passport-local JWT Token 的关注

node js jwt如何将令牌传递给其他路由以稍后检查登录的用户信息