java实现URL签名算法

背景:

大家在写平台的CRUD时往往不会去太多的关心链接的安全问题,但问题发生之后往往又追悔莫及;假设一个场景:“如果有人使用F12查看带你有一个"http://localhost:8080/user/delete?id=1"的接口地址,然后把id=2修改一下重新请求你的服务器,甚至直接一个for循环不断修改id的值去删除你的用户,后果就可想而知了”。当然,有人会说我用户表时逻辑删除,或者更甚说我们后台是的接口都是需要登录状态才可以访问的,这些是远远不够的,那是否有一种方式可以防止他人修改我们的链接参数并控制链接的时效性来保证安全呢,嘿嘿,签名算法就应运而生了。


解决的问题:

1、 防止链接参数被篡改恶意请求

2、 控制链接的时效性(控制链接有效期,过期无效)


实现思路:

1、 用户登录之后下发一个加密盐(盐可以自己随机生成,位数和内容个人可以随意),同时可以将盐和用户信息保存在一起(如redis中);

2、登录完的后续的每个请求添加一个签名(sign),签名的生成包含: (1)登陆时返回的盐(保证安全性) (2)请求的后台接口地址及参数(加密的数据) (3)时间戳(第一:保证加密后的唯一性,换句话说就是1和2都有可能不变,但是时间戳每时每刻都在变,保证同次加密生成的签名不一样,第二:控制链接的时效性,下面会讲解) (4)生成签名的算法,比如md5,sha等等按个人选择而定但需要前后端协商好,因为双方都需要生成签名(保证安全性)

3、后端接收到请求之后,先判断是否携带了签名和时间戳 未携带:返回403,非法请求 携带了:将后台保存的盐,从request中获取地址和参数, 前端携带的时间戳及相同的加密算法也生成一个后端的签名(realSign),比较两者是否相等 不相等:返回403,非法请求 相等:校验携带的时间戳和当前时间的差大于指定时间(一般大于30分钟,可自定义时间)则判定为过期链接,这边注意,因为时间戳也是我们加密的一部分,所以前端加密的时间戳也需要作为参数传递给后端,一是作为后端的加密参数,二是为了判断链接的时效 java实现URL签名算法_第1张图片


注意事项:

1.这边为了使前后端的加密信息完全一致,建议将加密信息做一个排序,防止因为顺序导致的加密不一致的情况 2.有部分人登录是使用token来维护登录状态的,不要搞混淆token和我所说的盐的区别,是两个东西,使用token当作盐的话是可以实现,但是非常不建议这么做,因为你的token需要每次请求都携带出去,这样无疑暴露了你的加密数据,不安全 3.个人建议盐的下发不要直接明文传给前端,可以进行一个非对称加密下发,因为这个签名的核心在于盐和你的加密算法,如果两者都被第三方获取,那你的签名就没有意义了

总结:

url签名算法主要是通过给每个链接一个特定的签名,服务端通过接受到的参数和链接以同样方式加密比较两者的签名来确定参数是否被篡改,如果你的签名加密被破解就没有意义了,所以保证加密的盐和算法是其重中之重;
这边不上代码了,后期有需要可以写一份,个人感觉描述的比较清楚了,如有错误欢迎留言指正

你可能感兴趣的:(java,java,算法)