PKCE中S256模式code_challenge的正确计算方法
PKCE S256 模式 code_challenge 计算方法
已知输入输出如下:
- 初始生成的code_verifier值:
B90Xq7Y6UhxU0SC9VyS1jZOC24S-H0fg6ScxriFboubD5mu- - 采用S256挑战方法时,预期得到的正确code_challenge值:
G0rGJ_-MUvTJ0-qvJxBqRULT2unY5V8_hqvnMpDRbEA
计算结果不匹配的根本原因
之前的计算逻辑存在关键偏差:SHA256运算完成后,把哈希结果转成了十六进制字符串,再直接对这个十六进制字符串做Base64编码——这一步完全不符合规则。
规范要求的Base64编码对象是SHA256输出的原始二进制字节,不是十六进制转换后的可读字符串。相当于给哈希结果多做了一层文本转码,最终结果自然和预期不符。
标准计算步骤
严格按照S256挑战方法的规则,完整执行顺序共4步,不能缺漏、调换:
- 取原始code_verifier字符串的原始字节(注意不要追加换行、空格等任何额外字符,否则会改变哈希结果),计算其SHA256哈希值,得到32字节长度的原始二进制结果
- 对这32字节的原始二进制结果做标准Base64编码
- 替换编码结果中的特殊字符:将
+替换为-,/替换为_,转换为URL安全的Base64URL格式 - 移除编码结果末尾所有的
=填充字符,最终得到的字符串就是合法的code_challenge
可直接验证的Bash实现
echo -n B90Xq7Y6UhxU0SC9VyS1jZOC24S-H0fg6ScxriFboubD5mu- | sha256sum | xxd -r -p | base64 | tr '/+' '_-' | tr -d '='
执行上述命令输出结果为:G0rGJ_-MUvTJ0-qvJxBqRULT2unY5V8_hqvnMpDRbEA
和预期结果完全一致。
命令各环节作用说明:
echo -n:输出原始code_verifier内容,不自动追加末尾换行符,避免额外字符改变哈希输入sha256sum:计算输入内容的SHA256值,默认输出十六进制格式的哈希文本xxd -r -p:将十六进制格式的哈希文本还原为原始二进制字节流,这就是之前遗漏的关键步骤base64:对原始二进制字节流做标准Base64编码- 两段
tr命令:分别完成Base64到Base64URL的特殊字符替换、移除末尾的等号填充符
内容的提问来源于stack exchange,提问作者user1156544
相关产品推荐
相关产品推荐

