关于签名校验的思考

前言

现实开发中,我们可能会遇到参数被篡改的情况,所以一般一些重要的接口都会进行签名校验,用的比较多的是MD5。实现过程是前端和后端进行统一的签名方式和秘钥去生成签名,后端对比签名是否一致,不一致则直接拒绝访问,不再进行操作。

思考

上面的方式一直有个问题,私钥放前端,那不是很容易被有心的人给获取到,从而绕过签名校验吗,那要怎么样才能隐藏秘钥呢?

方式

直到我看到了一个预约的网页,他们的方式是先采取提前用一个不需要签名校验的接口去获取相关参数和对应的参数生成的签名,即由服务端先生成好,然后下一步的时候传相关的参数和签名。
这样既可避免签名由前端生成,还可以使后端的接口解耦,不需要接口去重复判断一些内容,例如:
有一个一周内的预约列表,我提前生成好了下一步预约需要的相关参数和秘钥,以便下一步调预约接口时使用
关于签名校验的思考_第1张图片
上面这张图是获取预约列表的接口,其中的签名根据date,timespan生成的,这样下一步调用预约接口的时候就传date,timespan还有签名sign过去,这样就可以防止预约的接口被黄牛之类的用软件去重复刷票,减轻预约接口的压力

总结

上面只是我的一次经历,应该还有其他好的解决方案我暂时没想到,如果有相关的解决方案期待大家提出来让我进行学习。

好的设计方案真的很重要,理解业务再去反思接口架构的设计,是程序员想要往前走一定要多思考的,特别是前端,不学习不思考很容易落后于人,以此共勉

后续

后面有了解过银行的那种动态口令的方式也是一种方案,即秘钥每隔一段时间会变一下。
当用户登录后给用户分配一个动态秘钥,这个秘钥的更新机制可以自行规定,例如每次登录更新,隔一段时间更新,根据调用频率来更新之类的。
这样一些需要校验签名的接口就可以根据动态秘钥去生成签名交由后端去校验。
这样做的好处在于你没法直接动态篡改参数去刷接口,也是安全的一种设计方案。

你可能感兴趣的:(前端面试题,前端,安全)