开发者工具·Unix时间戳转换器
为什么你的 JWT 立即过期:exp 以秒为单位,而不是毫秒
· 为什么它很重要
jwt 时间戳 安全
RFC 7519 将 exp、iat 和 nbf 定义为自纪元以来的秒数,并将其与毫秒时钟混合使令牌立即过期或永不过期。这篇文章解释了声明格式以及如何检查令牌的时间。
于 10:00 发布,于 10:00 过期 — 令牌首次使用时被拒绝,服务器时钟不是问题
第一次请求被拒绝的令牌会引起对服务器偏差的怀疑,但在更改时钟之前检查原始声明。如果一个组件从毫秒时钟生成 `exp`,而另一个组件则比较 NumericDate 秒,则这些值相差三个数量级。普通的同步调整无法解释这种差距。
使用一次性或经过编辑的令牌,因为不记名令牌是一种凭证。 ToolAcre 的 JWT 解码器读取有效负载数据,但故意不验证签名。仅在保留原始测试夹具及其预期寿命后,才将数字时间声明复制到时间戳转换器中。
RFC 7519 所说的 — NumericDate 自 1970-01-01T00:00:00Z 以来的秒数,以及为什么它是数字而不是字符串
相邻发布的 JWT 文章已经说明了关键合同: `exp` NumericDate 从 Unix 纪元开始计算秒数。重复其标准解释在这里不会增加任何价值。实际问题是每个生产者、序列化器、验证器和测试装置是否遵循相同的规模。
寻找显式边界代码:发布时将毫秒时钟划分为秒,验证时进行秒比较。声明应保留为数字,而不是用于算术的格式化日期。人类可读的 UTC 是一种诊断预测,而不是令牌的权威表示。
在发行者和验证者测试中将此合约固定为非零值。使用零纪元的测试无法揭示任何一方是否除或乘以一千。
现有的 JWT 文章建立 NumericDate 秒;本文将这一事实应用于过期调试
如果验证者将有效的秒声明解释为毫秒,则日期接近 1970 并且显示为已过期。如果发行者将当前毫秒值写入稍后解释为秒的字段中,则到期时间将远远超出预期生命周期或超出库支持的范围。出现哪种症状可以确定哪一方存在比例误差。
避免根据数字计数接受两种形式的“修复”。这会将格式错误的代币变成永久的替代协议,并可以隐藏发行者的回归。拒绝违反应用程序 NumericDate 约定的值,正确生成,并添加区分秒和毫秒的固定装置。
毫秒错误可能会导致立即拒绝或令人难以置信的远程过期,具体取决于哪一方出错
在框架转换之前解码有效负载以将 `exp`、`iat` 和 `nbf` 作为原始值公开。将 `exp − iat` 与预期令牌生命周期(以秒为单位)进行比较。单独检查`nbf`;令牌可能未过期但无法使用。不要从看似合理的时间来推断真实性。
ToolAcre 的解码器报告签名验证错误,因此其输出属于调试,而不是授权。修改后的有效负载可以包含攻击者选择的任何到期时间。可信应用程序验证者仍必须对原始紧凑令牌执行算法、密钥、发行者、受众和时间策略。
工作示例:1700003600 的 exp — 将其转换为 UTC 和本地时间,根据 iat 检查它,并确认生命周期是您想要的
对于 `iat = 1,700,000,000` 和 `exp = 1,700,003,600`,相减得到 3,600 秒,即一小时。转换器将到期时间显式读取为秒并返回 `2023-11-14T23:13:20.000Z`;发布时间为 `2023-11-14T22:13:20.000Z`。
这些数字对于本文的诊断示例来说是唯一的。如果选择毫秒会产生 1 月 1970 读数,则表明比例错误。在得出一小时政策正确实施的结论之前,请确认验证者的当前时间也以秒为单位表示。
一小时的差异是在格式化之前计算的,因此每个区域仍保持一小时。本地显示可能有所不同,但 `exp − iat` 不会。
工作示例:使用显式秒数将 exp 1,700,003,600 与附近的 iat 进行比较
验证者可以允许应用程序定义的时间声明周围的较小容差,以适应适度的时钟差异。该存储库没有定义建议的秒数,因此这里没有规定通用的回旋余地。安全策略和库配置才是权威。
相对于千倍的容差应保持很小。将其扩展直至格式错误的索赔通过会削弱到期执行并导致发行人错误继续存在。首先标准化时钟单元和同步;然后决定有限限额是否服务于应用程序的威胁模型。
如果配置了容差,则在几秒钟内测试该边界内部和外部的值。这证明了策略独立于任何日期或区域设置呈现。
容差无法修复 1,000 因子不匹配
时间戳转换无法验证令牌的签名、允许的算法、密钥、发行者或受众。即使是格式完美的未来 `exp` 声明也可能位于伪造的令牌内。 JWT 解码器有意对此边界透明,并且应与可信验证器配对。
它还无法确定捕获的生产令牌是否已被撤销,或者会话策略是否覆盖其名义到期时间。使用非敏感装置调试值。如果真实事件需要检查凭据,请使用授权环境和处理程序,而不是一般的剪贴板工作流程。
解码只能在例行调试期间使用合成或安全编辑的装置进行。复制实时持有者凭证会产生与时间戳算法无关的安全问题。
要点:exp 是十位数字,而不是十三位 — 以及 JWT 解码器和 Unix 时间戳转换器如何位于同一个选项卡中,以便您可以在几秒钟内检查索赔
将 JWT 时间声明视为每个边界处的秒数,并测试它们的差异作为持续时间。时间戳转换器将单个声明转换为 UTC 和本地上下文; JWT 解码器公开原始数字。他们一起解释时机,但没有声称信任。
持久更正属于发布和验证代码,而不是在令牌起作用之前切换单位的支持运行手册。保留明确的秒数,拒绝格式错误的比例,并将签名验证保留为单独的强制性决策。
这种分离还提高了可观察性:生成日志可以在不暴露令牌的情况下报告持续时间策略,而验证指标可以区分过期、过早和无效签名结果。