背景与价值请求签名可提升完整性并防止重放。Date与Digest头配合签名与窗口校验是通用模式。统一规范Date窗口:签名时间与当前时间差不超过窗口(如300秒)。Digest:对主体内容计算 `SHA-256` 并作为 `Digest` 头。JWS:以 `RS256/ES256` 对选定头与路径进行签名。核心实现摘要与JWSfunction enc(s: string): Uint8Array { return new TextEncoder().encode(s) } function b64url(b: ArrayBuffer): string { const u = new Uint8Array(b); let s=''; for (let i=0;i<u.length;i++) s+=String.fromCharCode(u[i]); return btoa(s).replace(/\+/g,'-').replace(/\//g,'_').replace(/=+$/,'') } async function sha256(s: string): Promise<string> { const d = await crypto.subtle.digest('SHA-256', enc(s)); return b64url(d) } async function sign(headers: Record<string, string>, path: string, method: string, key: CryptoKey, alg: 'RS256'|'ES256'): Promise<string> { const header = b64url(enc(JSON.stringify({ alg, typ: 'JWT' }))) const payload = b64url(enc(JSON.stringify({ method, path, headers }))) const sig = await crypto.subtle.sign(alg==='RS256'?{ name:'RSASSA-PKCS1-v1_5', hash:'SHA-256'}:{ name:'ECDSA', hash:'SHA-256' }, key, enc(header + '.' + payload)) return header + '.' + payload + '.' + b64url(sig) } 窗口校验function timeNow(): number { return Math.floor(Date.now()/1000) } function within(dateSec: number, leewaySec = 300): boolean { const now = timeNow(); return Math.abs(now - dateSec) <= leewaySec } 落地建议对关键请求加入Date与Digest头并进行JWS签名,资源端校验窗口与摘要。对一次性标识与重放存储进行维护,阻断重复请求。验证清单时间窗口是否通过;Digest是否与主体一致;签名是否验证成功。

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部
1.764856s