JSON Web Token(JWT)作为电子邮件激活的URL

28

这个特定的令牌是不安全的,因为你的签名密钥很容易被猜到。 - Thilo
此外,电子邮件地址不应该也是JWT的一部分吗?还是有其他唯一的用户标识符?它是“公司:Toptal”吗? - Thilo
好的,那只是一个例子,我甚至不知道解码后的数据。如果签名密钥很强呢?作为链接的JWT是否安全?在这里提到:https://github.com/dwyl/learn-json-web-tokens#q-if-i-put-the-jwt-in-the-url-or-header-is-it-secure 真的让我感到困惑。 - momokjaaaaa
假设电子邮件地址和唯一用户标识符在JWT中。 - momokjaaaaa
相关链接:http://security.stackexchange.com/questions/91348/jwt-for-email-validation-of-an-account - Thilo
你实现了这个功能吗?如果是的话,可以解释一下吗?我寻找这个已经很多天了。 - Eniss
2个回答

24
你链接的FAQ中提到:

JWT令牌在url中使用的用例包括:

这两个用例都是单次使用令牌(点击后过期)的好选择。

因此,是的,只需要确保每个电子邮件只能被激活一次(如果签名可以被伪造,那么你的验证就会被绕过,请不要使用你的示例中的可怕“秘钥”)。

我已经阅读了它们并有疑问。它如何保证安全?你能解释一下吗?当激活链接被点击/访问后,你如何使jwt令牌失效? - momokjaaaaa
在电子邮件中公开签名是安全的吗? - momokjaaaaa
1
使令牌失效:您的帐户数据库将知道该电子邮件已经被验证过了。因此,令牌不能被使用两次。 - Thilo
安全:这完全取决于没有人能够伪造令牌(未获取电子邮件)。而且只有在使用真正的秘密签名密钥时才有效。但是,如果使用了真正的秘密签名密钥,则确实有效。您还应该使这些令牌过期(对于电子邮件激活,一小时应该足够,如果不行,则允许重新发送)。 - Thilo
在用户表中,一旦访问链接,我会将“is_active”更改为True。但是令牌仍然有效。网站提到一旦访问链接就使令牌失效。我该如何立即使JWT令牌失效? - momokjaaaaa
如果无法使用令牌,则该令牌无效。如果您看到 is_active 已设置,则可以拒绝该令牌。必须确保相同的令牌不能用于应用程序中的其他操作。如果在其他地方使用 JWT 令牌,则可以将声明 "action=emailActivation" 放入令牌中。 - Thilo

19

使用像JWT这样的无状态令牌是安全的,只要您用于签署令牌和验证令牌的方式是安全的。但在将JWT用作密码重置URI中的身份验证令牌之前,您应该考虑某些其他方面...

由于您无法使特定的JWT失效(除非再次保持状态),而且到期时间不足以满足(在这种情况下),您基本上希望您的JWT成为通常所知的一次性或单次使用令牌。原因是您可能不希望单个密码重置链接被多次使用以重置密码,因为这可能允许攻击者通过不断更改密码完全锁定用户。

我在这里描述了如何实现: Single-Use Tokens w/ JWT - 基本上,您需要将服务器端的某种状态(例如用户密码的哈希值)转换为HMAC密钥,并使用它来签署用户特定的令牌。这将导致在密码更改后令牌验证失败...


1
由于您正在使用来自服务器存储的密码,因此您的请求不是无状态的。对于每个传入请求,您都必须查询您的密码哈希并将其转换为HMAC密钥。在不可避免的数据库请求开销之上,您还增加了加密开销。因此,如果您无法避免首先进行查询,为什么不只存储用于重置密码令牌的指定ID呢? - Sergey Kolesnik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接