springboot~关于md5签名引发的问题

事实是这样的,我有个接口,这个接口不能被篡改,于是想到了比较简单的md5对url地址参数进行加密,把这个密码当成是sign,然后服务端收到请求后,使用相同算法也生成sign,两个sign相同就正常没有被篡改过。

问题的出现

  • 接口中的参数包括userId,extUserId,时间,其中extUserId字符编码,中间会有+这种符号
  • 有些用户使用签名接口正常
  • 有一些用户总显示签名失败

问题原因

  • 因为有些用户的extUserId中包括了url上的特殊字符,它不能正常在在url上传输,必须进行urlEncode编码才行,这一点非常容易被忽略;程序中一般不需要手动urlDecode解码,都是由框架帮我们实现的。
  • 下面整理了一些url上需要编码的字符:
    • + URL中+表示空格 十六进制: %2B
    • / 分离目录和子目录 十六进制 : %2F
    • ? 分离实际的URL和参数 十六进制: %3F
    • % 特殊字符 十六进制: %25
    • # 表示书签 十六进制: %23
    • & URL中指定参数间的分隔符 十六进制: %26
    • = URL中指定参数的值 十六进制:%3D
    • 空格 URL中的空格可以用+号或者编码 十六进制 : %20

url在签名时一般这样处理

sign=md5(userId+extUserId+simpleDateFormat.format(new Date()) + SECRET).toUpperCase();
?extUserId=URL.Encode(extUserId)&sign=sign

注意:sign中是接收的参数,它不需要Encode,应该框架已经帮我们做了;而向下传递的url参数extUserId是需要手动Encode的。

posted @   张占岭  阅读(197)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示
历史上的今天:
2018-04-23 java~日期与字符串的转化
2014-04-23 MVVM架构~前台后台分离的思想与实践
2012-04-23 架构,改善程序复用性的设计(目录)
点击右上角即可分享
微信分享提示