是否可以在JWT中存储用户凭据(用户名/密码)(以后sign
和verify
生成的令牌?
不,在JWT中发送密码是不安全的。这是因为 JWT索赔只需编码,任何人都可以轻松解码 看到他们。将任何敏感信息存储在a中是不安全的 返回给用户的JWT
但我不知道为什么JWT网站recommends使用它进行身份验证:
什么时候应该使用JSON Web令牌?
以下是JSON Web Tokens非常有用的一些场景:
身份验证:这是使用JWT的最常见方案。一旦 用户登录后,每个后续请求都将包含JWT, 允许用户访问的路由,服务和资源 允许使用该令牌。单点登录是一项广泛的功能 现在使用JWT,因为它的开销很小,而且能力很强 容易在不同的领域使用
答案 0 :(得分:10)
JWT是身份验证的结果。例如
JWT令牌中有什么内容?
嗯,最简单的JWT包含有关该符号的信息(我不能在此详细输入,因为我不是安全专家),它允许在请求时检查符号是否已损坏收到JWT。
此信息可以通过数字签名验证和信任
除此之外,JWT允许发送有效载荷。
更正式地说,JWT由以下人员组成:
例如,如果我使用我的凭据用户名:密码为gabriel:giussi向身份验证服务发送请求,它将检查此凭据,如果它们可以,则可以创建以下JWT。
然后对于每个请求,我将编码包含我的用户名和服务的JWT
答案 1 :(得分:2)
您应该仅使用jwt来存储API将使用的令牌。成功登录后将生成令牌,并且可以将其附加到发送到API的任何请求,并且只有令牌有效时才应继续执行所有请求。
答案 2 :(得分:0)
简而言之:是的,如果在放入JWT的有效负载之前加密数据并在JWT验证后使用它进行解密,则可以在JWT中传递/接收敏感数据。
在一般情况下,您不需要将用户凭据保留在JWT中,因为JWT本身就是一个动态生成的凭证,代表了JWT生成时提供的登录名/密码。
1.1但是,您可以传递的内容不像纯登录名/密码那样敏感,但仍保留在JWT验证时所需的有价值的信息。它可以是用户ID(在sub声明中,如果需要,可以在hashed中输入)或访问级别代码等。
但是,如果您希望可以通过JWT传递敏感信息。按照下面的步骤,一切都很容易。
2.1对于敏感数据,您可以在JWT的有效负载中使用特定的private claims,例如:
{
// These are registered claims: (see https://tools.ietf.org/html/rfc7519#section-4.1)
"sub": "1234567890",
"name": "John Doe",
"iat": 1516239022
// There can be some public claims you are not afraid to expose to the world
// these are omitted here for brevity (see https://tools.ietf.org/html/rfc7519#section-4.2).
"omitted": "for brevity",
// And here can go some private claims you wish to include in the payload, e.g.:
"sensitiveInfo": {
"username": "admin",
"password": "12345",
"account_balance": 10000,
"etc": "something else"
}
}
2.2默认情况下,sensitiveInfo
有效负载密钥仅以base64编码(因此,获得JWT的任何人都可以轻松读取)。为了使其安全,您可以使用某些外部模块(例如,NodeJS上的crypto
或bcrypt
或您选择的PHP's techniques)对其进行加密。
2.3在这种情况下:
jwt.verify()
in Node)之后,您将获得sensitiveInfo
密钥中带有加密数据的已解码有效负载。现在,您只需要decrypt数据并按计划使用它即可。就这样。