一个'&'引起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在输出字符串时不加上换行符。

 

posted @ 2018-12-10 14:05  喜欢哲学的猴子  阅读(1726)  评论(0编辑  收藏  举报