ZeroTool Workbench

PKCE 生成器

为 OAuth 2.0 / 2.1 授权码流程生成密码学安全的 PKCE code_verifier 与 code_challenge。支持 SHA-256(S256)与 plain 方法,完全在浏览器中运行,零网络请求。

100% 浏览器端运行 数据不离开你的设备 免费 · 无需注册
0 43–128 chars · [A-Z a-z 0-9 -._~]

Challenge Method

Code Challenge
Authorization URL preview paste & tweak for your provider
Token exchange (cURL) send verifier on /token

All randomness, hashing and URL preview happens in your browser. Nothing is uploaded.

使用方法

  1. 页面加载时自动生成一个 64 字符的 code_verifier
  2. 点击 重新生成 获取新的随机 verifier,也可以手动粘贴你自己的。
  3. 选择 Challenge 方法——除非有充分理由,否则保持 S256。
  4. code_challenge 实时更新。复制到你的 /authorize 请求里。
  5. 展开 授权 URL 预览,填入你的端点、client_id、redirect_uri。
  6. 展开 令牌交换(cURL),拿到可直接运行的 /token 请求命令。

典型场景

  • 本地 OAuth 调试:生成 verifier/challenge 对,把授权 URL 复制到浏览器获取 code,再用 curl 预览回放 /token 交换。
  • 移动 / 桌面客户端:不用搭后端就能为 iOS / Android / 桌面应用手工跑通测试流程。
  • 对接新 Provider:在写一行代码之前,验证目标 Provider 接受 S256 且 client_id 已正确配置。
  • 安全评审:直接对照工具确认 verifier 字符集与长度是否符合 RFC 7636,不必中途翻规范。

原理

  1. crypto.getRandomValues 取 32 字节随机数,base64url 编码后截到目标长度。
  2. S256 时,verifier 经 UTF-8 编码后用 crypto.subtle.digest(‘SHA-256’, …) 计算哈希。
  3. 32 字节哈希再做 base64url 编码(+ 换 -、/ 换 _、剥掉 = padding),得到 43 字符的 challenge。
  4. plain 模式下 challenge 等于 verifier 本身,只为兼容,不建议使用。

FAQ

PKCE 是什么?为什么需要它?

PKCE 全称 Proof Key for Code Exchange(RFC 7636),用来防止 OAuth 授权码在传输过程中被截获。它对无法安全保存 client secret 的公共客户端(移动 App、SPA、CLI、桌面应用)尤其重要。OAuth 2.1 已经把 PKCE 设为所有客户端的强制要求,而不仅是公共客户端。

S256 与 plain 该用哪个?

生产环境永远用 S256。plain 方法只保留给历史上无法计算 SHA-256 的客户端,而这个限制在今天已经不再成立。RFC 7636 明确推荐 S256,主流 OAuth Provider 默认会拒绝 plain。

这个工具会把 verifier 上传到任何地方吗?

不会。随机字节来自浏览器的 crypto.getRandomValues,哈希通过 crypto.subtle.digest 完成,URL 预览是纯字符串拼接,所有计算都在浏览器内完成。verifier 也不写入 localStorage,每次刷新都会重新生成。

verifier 应该多长?

RFC 7636 规定 43 到 128 个字符,字符集是 [A-Z a-z 0-9 - . _ ~]。默认 64 字符是平衡点:熵足够抗暴力破解,长度又不会撑爆 URL。如果你的 Provider 接受 128 字符且想最大化熵,可以拉到上限。

怎么把它接入我的 OAuth 流程?

在客户端安全保存 code_verifier(浏览器用 localStorage,原生 App 用安全存储),在 /authorize 重定向时通过 query 参数携带 code_challenge 与 code_challenge_method=S256。当 /token 交换授权码时,把原始 code_verifier 回传给服务器,让它重新哈希并比对。