JSON Web Token (JWT) 作为电子邮件激活的 URL
Posted
技术标签:
【中文标题】JSON Web Token (JWT) 作为电子邮件激活的 URL【英文标题】:JSON Web Token (JWT) as a url for email activation 【发布时间】:2016-07-27 16:27:52 【问题描述】:将 JWT 作为电子邮件中的激活 url 有多安全?
例如: 点击链接激活您的帐户 http://127.0.0.1:8000/account/activate/eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJ0b3B0YWwuY29tIiwiZXhwIjoxNDI2NDIwODAwLCJodHRwOi8vdG9wdGFsLmNvbS9qd3RfY2xhaW1zL2lzX2FkbWluIjp0cnVlLCJjb21wYW55IjoiVG9wdGFsIiwiYXdlc29tZSI6dHJ1ZX0.yRQYnWzskCZUxPwaQupWkiUzKELZ49eM7oWxAQK_ZXw
【问题讨论】:
这个特殊的令牌是不安全的,因为你的签名秘密很容易被猜到。 另外,电子邮件地址不应该也是 JWT 的一部分吗?还是有其他一些唯一的用户标识符?是“公司:Toptal”吗? 好吧,这只是一个例子,我什至不知道解码后的数据。如果签名秘密很强大怎么办? jwt 作为链接安全吗?这里提到github.com/dwyl/…真的让我很困惑。 假设电子邮件地址和唯一用户标识符在 jwt 中 相关:security.stackexchange.com/questions/91348/… 【参考方案1】:FAQ you link to 说:
在 url 中使用 JWT 令牌的用例是:
帐户验证 - 当您在某人在您的网站上注册后通过电子邮件发送链接时。 https://yoursite.co/account/verify?token=jwt.goes.here 密码重置 - 确保重置密码的人可以访问属于该帐户的电子邮件。 https://yoursite.co/account/reset-password?token=jwt.goes.here这两个都是一次性令牌的理想候选者(点击后过期)。
所以,是的。只需确保每封电子邮件只能激活一次(并且不要使用示例中可怕的“秘密”密钥,如果可以伪造签名,则可以绕过您的验证)。
【讨论】:
我阅读了它们并有疑问。怎么可能安全?你可以解释吗?以及单击/访问激活 url 后如何使 jwt 令牌失效? 在电子邮件中公开签名是否安全? 使令牌无效:您的帐户数据库将知道电子邮件已经过验证。所以一个令牌不能被使用两次。 安全:这一切都取决于没有人可以伪造令牌(没有收到电子邮件)这一事实。这只有在您使用真正秘密的签名密钥时才有效。但它确实有效。您还应该使这些令牌过期(对于电子邮件激活,一个小时应该足够了,如果没有,允许重新发送)。 在用户表中,一旦链接被访问,我将“is_active”更改为 True。但是令牌仍然有效。网络提到一旦访问链接,令牌就会失效。链接访问后如何使 JWT 令牌立即失效?【参考方案2】:使用 JWT 之类的无状态令牌是安全的,只要您用于签署令牌的密钥和验证它的方式是安全的。但是在您的密码重置 URI 中使用 JWT 作为身份验证令牌之前,您应该考虑一些其他方面...
由于您无法使特定 JWT 无效(无需再次保持状态)并且到期还不够(在这种特定情况下),因此您基本上想要拥有的 JWT 是众所周知的一次性 -或一次性令牌。原因是您可能不希望单个密码重置链接多次用于重置密码,因为它会允许潜在的攻击者完全锁定用户(通过不断更改密码)。
我在这里描述了它是如何工作的:Single-Use Tokens w/ JWT - 基本上,您需要将服务器端的某种状态(在您的情况下,例如用户密码的哈希)转换为 HMAC 密钥并使用用于签署您的用户特定令牌。这将导致更改密码后令牌验证失败...
【讨论】:
以上是关于JSON Web Token (JWT) 作为电子邮件激活的 URL的主要内容,如果未能解决你的问题,请参考以下文章