签名接口联调时后端一直返回 401 签名不匹配,前端把摘要打印出来是 ba7816bf...,后端日志里期望的是 BA7816BF...。明文完全一样。日志里能对上时间点,这种反而好排。

十六进制编码有大写和小写两种写法,摘要本身相同,字符串比较却区分大小写。前端转 hex 默认小写,后端按大写拼签名,直接比较永远不等。这一点先确认清楚,后面就不用反复试。

echo -n "abc" | sha256sum
echo -n "abc" | openssl dgst -sha256 -binary | base64

「哈希大小写」确认了原因之后,改动尽量只碰那一处,顺手改的东西后面最容易出问题。偶发问题先统计频率,一小时几次和一天一次,查法完全不同。

改完顺手把文档补一句,省得下次自己重新推一遍。监控和日志的时间要对上,时区不一致会多绕很大一圈。

处理上按这个顺序:两端统一转小写后再比较;能比字节数组就直接比字节 别转字符串;签名算法和编码写进接口文档;联调时两端各打印一次原文和摘要。

结果对不对很好判断,同一段明文两端算出的摘要转小写后完全相同 请求返回 200。

作者 9823189