PHP与Node.js生成SHA256哈希结果不一致,求排查解决
PHP复现Node.js code_challenge哈希逻辑结果不一致的问题排查
问题核心在于PHP与Node.js处理哈希结果的格式差异:Node.js直接使用SHA256的二进制原始哈希数据进行编码,而你的PHP代码默认使用了哈希的十六进制字符串结果,导致后续编码逻辑完全偏离。
修正后的PHP代码
$code_verifier = "8uZj2CcGT9QS9uAiWOsN0EziwLnkfGEHEHHhWNOgOYpqsNrp97foyz4OK3TKQ3C6vE3T0FnN6Yo3WZ5A"; // 开启hash函数的二进制输出模式(第三个参数设为true) $binary_hash = hash('sha256', $code_verifier, true); $code_challenge = rtrim(strtr(base64_encode($binary_hash), '+/', '-_'), '=');
原代码错误说明
- 原PHP代码中
hash('sha256', $code_verifier)默认返回64位十六进制字符串(例如e4548f36b7acfe766c16db9b2f7665db5466986332b6309d757f6dcd6fe74c00),对这个字符串做base64编码,和Node.js直接对32字节二进制哈希值编码的结果必然不同。 - Node.js的
crypto.createHash('sha256').update(buffer).digest()直接输出SHA256计算后的二进制原始数据,再进行Base64 URL安全转换,这才是符合PKCE规范的正确流程。
内容的提问来源于stack exchange,提问作者Joee4
相关产品推荐
相关产品推荐

