支付是一个安全级别很高的场景,系统间交互的每一条数据的泄露都可能造成很大的损失。因此,系统之间交换的每一条数据在支付时都会被加密。这里请参考支付宝支付中使用的加密规则。
图片来自Pexels
什么是签名?
在理解签名之前,先回顾一下支付的交互过程。如上图所示,支付流程大致可以分为六个步骤:
在这六个步骤中,最重要的是第二步和第六步。拆卸如下:
商家服务器与支付宝服务器交互过程中传输的信息极其敏感,需要防止中间人在交互过程中篡改信息。比如第二步商品金额改为0,支付宝会被误认为转账0元。
数字签名解决了交互中的这个安全问题。它可以验证消息或文档的真实性。
在支付宝支付的界面中,有一个签名参数用来填写签名。这种签名的目的是防止信息伪造。这样,可以有效地防止消息在传输过程中被篡改。
签名的实现原理
签名原则
数字签名是信息安全的保证,它的实现依赖于两个系统的密钥。
签名过程如下:
计算要签名的文档的哈希。不管输入文档的长度如何,输出长度总是固定的。例如,使用SHA256是256位。
对结果散列和一些额外的元数据进行编码。例如,接收方需要知道您正在使用的哈希算法,否则它无法处理签名。
用私钥对编码后的数据进行加密,结果就是一个签名,可以附在文档上作为认证的依据。
验证签名(Verification signature):接收方接收文档,并使用相同的哈希算法独立计算文档哈希。
然后,她用公钥解密消息,解码哈希,然后确认使用的哈希算法是否正确,解密的哈希是否与本地计算的哈希相同。
非对称加密
支付宝非对称加密用于签署信息。非对称加密由公钥和私钥组成,通常称为公钥和私钥。
非对称加密的特点是:只有公钥才能解密私钥加密的信息,只有私钥才能解密公钥加密的信息。
一般会保留私钥,开发时会放在配置文件里。安全级别与数据库帐户密码相同。
公钥会交给其他系统,这样如果系统间交互时中间人不知道密钥,交互信息就无法被破解。
只要发送方保证私钥不泄露,任何人发送给接收方的信息都无法在签名验证中匹配成功。
支付宝的签名实现方式也差不多。支付宝在进行信息交互时,有两个非常重要的术语,支付宝公钥和应用公钥,总是容易混淆。
这是因为支付宝提供了两套RSA加密。一套用于保证步骤2订购接口时的信息安全,另一套用于保证步骤6回呼时的信息安全。
如下图所示,第二步,商家服务器用红色应用私钥(priv key 2)计算签名,支付宝用红色应用公钥(pub key 2)验证签名。
第六步:支付宝服务器用蓝色支付宝私钥(priv key 6)计算签名,商家用蓝色支付宝公钥(pub key 6)验证签名。
了解了签名计算的原理后,在管理平台中设置App信息就很容易了。我就以沙盒环境为例。
如上图所示,说明使用的是RSA2加密方式,哈希算法使用的是SHA256。设置后要设置应用公钥,保存支付宝公钥。
应用程序公钥和应用程序私钥需要自己生成一对,以确保步骤2的安全性。生成模式跳转支付宝开放平台开发助手。
支付宝的公钥和支付宝的私钥都是支付宝提供的,而支付宝的私钥是自己预留的,就像自己服务器的应用私钥一样,别人不会提供。回叫时复制公钥用于签名认证。
对称加密
虽然签名可以防止中间人信息被篡改,但是它不能防止中间人信息被查看。比如第二步,中间商可以得到每天发到支付宝的货款金额。
网络中信息传递的感觉是一个虚幻的过程,网络中的信息有可能被不法分子截获。
因此,在支付过程中,建议使用HTTPS协议进行交互,这样可以对交互信息进行加密传输。
而且支付宝的很多接口也支持AES加密后传输,信息更安全。
AES加密是一种对称加密算法,比非对称加密简单。系统中只有一个密钥,可用于加密或解密。
与支付宝交互的信息可以用AES加密。为防止信息泄露,官方对该接口的解释如下:
如果OpenAPI中没有bizContent参数,则不能使用AES key进行加密,否则会报错,当前API不支持加密请求。
比如alipay.user.info.share(支付宝会员授权信息查询接口)在不使用bizContent的情况下,无法使用AES密钥加密。
AES和RSA的关系
AES密钥对接口请求和响应内容进行加密,密文无法被第三方识别,从而防止接口传输的数据泄露。
使用RSA密钥对接口请求和响应内容进行签名,开发者和支付宝开放平台分别签名检查,确认接口传输的内容未被篡改。无论接口内容是明文还是密文,RSA都可以正常签名。
开发者可以先用AES加密请求参数,再用RSA对密文进行签名。
作者:三滴水
编辑:陶佳龙
资料来源:https://4m.cn/ZPW1A