Python与PHP中Base64+HMAC运算结果不一致的原因排查
为什么两段逻辑看似一致的Python与PHP代码返回结果不同?
核心问题出在字符串的转义处理差异上:
- Python的单引号字符串中,
\n会被自动解析为换行符(ASCII 0x0A),所以你的Python代码里,string_to_sign实际是包含多个换行的有效签名字符串。 - PHP的单引号字符串中,
\n不会被转义,会被当作两个独立的普通字符(反斜杠\+ 字母n),这就导致PHP代码里的$string_to_sign和Python版本的内容完全不一致,最终HMAC-SHA1计算出的签名自然不同。
修正后的PHP代码
把单引号改为双引号,让PHP解析\n为换行符:
$access_key = 'AKIAIOSFODNN7EXAMPLE'; $secret_key = 'wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY'; // 改用双引号解析换行符 $string_to_sign = "GET\n\n\nTue, 27 Mar 2007 19:36:42 +0000\n/awsexamplebucket1/photos/puppy.jpg"; echo $access_key . ':' . base64_encode( hash_hmac('sha1', $string_to_sign, $secret_key, true) );
运行修正后的代码,就能得到和Python一致的签名结果:AKIAIOSFODNN7EXAMPLE:qgk2+6Sv9/oM7G3qLEjTH1a1l1g=
内容的提问来源于stack exchange,提问作者kombi
相关产品推荐
相关产品推荐

