背景
客户端、服务端进行数据传递,对于接口的入参、返参数据需要增加防篡改的需求,以保证数据传输中的安全性。加签、验签是用来解决防篡改问题的。
具体场景:在客户端与服务端请求交互的过程中,请求的数据容易被拦截并篡改,比如在支付场景中,请求支付金额为 10 元,被拦截后篡改为 100 元,由于没有防篡改校验,导致多支付了金钱,造成了用户损失。
因此我们在接口设计时必须考虑防篡改校验,加签、验签就是用来解决这个问题的
加密和签名的区别
加密和签名都是为了安全性考虑,但略有不同。常有人问加密和签名是用私钥还是公钥?其实都是对加密和签名的作用有所混淆。简单的说,加密是为了防止信息被泄露,而签名是为了防止信息被篡改。
完整的流程
在实际运用中,要根据情况使用,也可以同时使用加密和签名,比如A和B都有一套自己的公钥和私钥,当A要给B发送消息时,先用B的公钥对消息加密,再对加密的消息使用A的私钥加签名,达到既不泄露也不被篡改,更能保证消息的安全性。
公钥加密、私钥解密、私钥签名、公钥验签。
相关链接: https://www.cnblogs.com/pcheng/p/9629621.html
https://juejin.cn/post/6844904154838597645
签名:
签名主要包含摘要和非对称加密两部分内容,首先对需要签名的数据进行摘要计算得到摘要值,然后通过签名者的私钥对摘要值进行非对称加密即可得到签名结果。
验签主要包含摘要、非对称解密、摘要比对三部分内容,首先对接收到的数据进行摘要计算得到验签方摘要值,然后通过签名者的公钥对摘要值进行非对称解密得到签名方摘要值,将签名方摘要值与验签方摘要值进行比对,如果相等则验签成功,否则验签失败。
1、参数排序
将需要签名的内容根据参数名称进行排序,排序规则按照第一个字符的ASCII码值递增排序(字母升序排序),如果遇到相同字符则按照第二个字符的ASCII码递增排序,以此类推。将参数内容进行排序,可以保证签名、验签双方参数内容的一致性。
为什么会产生不一致? 签名方以 Json 格式将参数内容发送给验签方,验签方需要将 Json 格式的参数内容反序列化为对象,由于验签方可能使用不同的编程语言,不同的 Json 框架,所以会导致双方的参数顺序不一致。
2、参数拼接
将排序后的参数与其对应值,组合成“参数=参数值”的格式,并且把这些参数用&字符连接起来,此时生成的字符串为待摘要字符串。
3、摘要计算
通过摘要算法求待摘要字符串的摘要值,常用的摘要算法如MD5、SHA、HMAC等。参数指纹
4、非对称加密
使用非非对称加密算法,利用客户端的私钥对摘要值进行加密,生成内容我们称之为签名。
5、发送请求
将参数内容、字符编码、签名方法(非对称加密算法)、签名发送给验签方。
验签
1、参数排序
将收到参数内容根据参数名称进行排序,排序规则与签名方保持一致。
2、参数拼接
3、摘要计算
4、非对称解密
使用相同的非对称加密算法,对收到的签名进行解密,得到签名方摘要值。
5、摘要比对
如果签名方摘要值等于验签方摘要值,则验签成功,否则验签失败。
