一个'&'引起md5签名不一致问题
有时会遇到这样一个问题,本地和接口在验证数据签名时,明明两端打印出来的两个字符串一模一样,但是md5加密后的两个密文却不一样。
例如:
本地字符串:$str = "a=1&b=2&c=3";
此时将数据请求到接口,接口获取到的数据可能会变成这样:$str = "a=1&b=2&c=3";
那是因为在html中 '&' 就是 '&',而在浏览器中 '&' 只会显示成 '&' ,所以是看不出两个字符串的差别的,需要打印两个字符串的长度才能发现长度不一样。
在使用http传输的过程中,'&' 会被替换成 '&' 进行传输。
这时接口端需要执行 :$str = str_replace("&", "&", $str);
将 '&' 替换成 '&’'然后才能进行md5加密,否则加密验证是不可能通过的。
另外,有时会遇到php的md5与linux的md5sum的得到的签名不一致的问题
PHP签名:php -r 'echo md5("签名的字符串");'
Linux签名:echo “签名的字符串” | md5sum
PHP最终签名的字符串是:签名的字符串
Linux最终签名的字符串是:签名的字符串\n
因为 linux 的 echo 都会自动带上 \n,所以导致跟php的md5得到的值不一样。
此时应该用:echo -n “签名的字符串” | md5sum
对 echo 加上 -n 参数,让echo在输出字符串时不加上换行符。