如何从Devise的哈希令牌中获取原始reset_password_token?
结论:无法从Devise生成的哈希令牌反向推导出原始reset_password_token
Devise的令牌生成逻辑采用单向哈希算法实现,设计上就是不可逆的,目的是防止数据库被拖库后攻击者直接获取到可用的密码重置原始令牌。
已知的令牌生成、正向哈希计算逻辑如下:
- 生成原始令牌与哈希令牌对
raw_token, hashed_token = Devise.token_generator.generate(self.class, :reset_password_token)
- 通过原始令牌计算对应哈希值
hashed_token = Devise.token_generator.digest(self, :reset_password_token, raw_token)
针对你提到的Sendgrid点击追踪篡改链接的场景,可按以下方案处理:
- 对密码重置类邮件单独关闭Sendgrid的点击追踪功能,避免平台重写链接导致令牌参数被篡改
- 若已有用户反馈重置链接失效,直接为对应用户重新生成新的重置密码令牌,发送新的邮件即可
- 如需排查问题可在发送重置邮件前添加日志,记录用户id与对应原始
raw_token的映射关系,后续收到失效请求时可对比请求携带的令牌与日志记录的原始令牌是否一致,确认篡改情况
内容的提问来源于stack exchange,提问作者new2cpp
相关产品推荐
相关产品推荐

