当前位置: 首页 > 后端技术 > Java

日常使用的支付宝支付加密规则你知道吗?

时间:2023-04-01 16:50:29 Java

前言支付是一个安全级别很高的场景,系统间交互的每一条数据的泄露都可能造成极大的损失。因此,支付过程中系统之间交换的每一条数据都将被加密。这里总结一下支付宝支付使用的加密规则,请参考。1、什么是签名?在了解签名之前,我们先回顾一下支付交互流程。如上图所示,支付流程大致可以分为6个步骤。用户选择自己的产品并提交订单。商户服务器将商品信息和所需金额发送给支付宝,生成支付宝订单。支付宝订单返回成功后,生成支付页面,方便手机支付或网页支付。调用手机支付宝APP进行支付。输入支付密码,发送至支付宝服务器。支付宝服务器转账成功,通知商户服务器订单金额转账成功。这六个步骤中,最重要的是第2步和第6步,拆解如下。商户服务器与支付宝服务器交互过程中传递的信息极其敏感,需要防止中间商在交互过程中篡改信息。比如在第2步把商品金额改成0,支付宝就会误认为转账是0元。数字签名在交互时解决了这个安全问题。它可以验证消息或文档的真实性。在支付宝支付界面中,有一个sign参数用来填写签名。这个签名的目的是为了防止信息伪造。这样,可以有效地防止消息在传输过程中被篡改。2.签名实现原理2.1签名原理数字签名是信息安全的保证,它的实现依赖于双方系统的密钥。签名过程如下:计算您要签名的文档的哈希值。无论输入文档的长度如何,输出长度始终是固定的。比如使用SHA256就是256位。对生成的哈希和一些额外的元数据进行编码。例如,收件人需要知道你使用的哈希算法,否则无法处理签名。编码数据使用私钥加密,结果是签名,可以将其附加到文档中作为身份验证的基础。验证签名(signatureverification):接收方收到文档,并使用相同的哈希算法独立计算文档哈希值。然后她使用公钥解密消息,解码哈希,然后确认使用的哈希算法是正确的,并且解密的哈希与本地计算的哈希相同。2.2非对称加密支付宝采用RSA非对称加密方式对信息进行签名。非对称加密由公钥和私钥组成,在代码中一般称为公钥和私钥。非对称加密的特点是:用私钥加密的信息只能用公钥解密,用公钥加密的信息只能用私钥解密。一般会保留私钥,开发时放在配置文件中。安全等级与数据库账号密码相同。公钥会交给其他系统,这样在系统间交互过程中,当中介不知道密钥时,就无法破译交互信息。只要发送方保证私钥不泄露,任何人发送给接收方的信息都无法在签名验证时匹配成功。支付宝实现签名的方式大致相同。支付宝在交换信息时使用了支付宝公钥和应用公钥两个非常重要的术语。这两个秘钥总是令人困惑。这是因为支付宝提供了两套RSA加密。一组用于保障步骤2统一下单接口的信息安全,另一组用于保障步骤6回调的信息安全。如下图所示,在步骤2中,商户服务器使用红应用私钥(privkey2)计算签名,支付宝使用红应用公钥(pubkey2)验证签名;第6步,支付宝服务器使用蓝色支付宝私钥(privkey6)计算签名,商户通过蓝色支付宝公钥(pubkey6)验证签名。了解了签名计算的原理后,就很容易去管理平台设置app信息了。我将以沙箱环境为例。如上图所示,说明使用的是RSA2加密方式,HASH算法采用SHA256。进入设置后,需要设置应用公钥,保存支付宝公钥。应用公钥和应用私钥这两个需要自己生成一对,以保证第2步的安全。生成方法跳转到支付宝开放平台开发助手支付宝公钥和支付宝私钥由支付宝提供,私钥key是支付宝自己预留的,和自己服务器的应用私钥一样,别人不会提供。公钥被复制并用于回调中的签名验证。3、对称加密签名虽然可以防止中介篡改信息,但是不能防止中介查看信息。例如,在步骤2中,中间商针对支付宝发送的商品金额,可以获得商家每天的交易金额。信息在网络中的传递感觉是一个虚幻的过程,网络中的信息有可能被不法分子截获。因此,在支付过程中,建议使用https协议进行交互,使交互信息加密传输。而且支付宝的很多接口还支持AES加密后传输,让信息更加安全。AES加密是一种对称加密算法,比非对称加密简单。系统之间只有一把钥匙,这把钥匙既可以用于加密,也可以用于解密。与支付宝交互的信息可以通过AES加密。为防止信息泄露,官方对该接口的解释如下:如果OpenAPI没有传递bizContent参数,则不能使用AES密钥加密,否则会报错。当前API不支持加密请求。例如:alipay.user.info.share(支付宝会员授权信息查询接口)如果不使用bizContent传递参数,则不能使用AES密钥加密。3、AES和RSA的关系AES密钥是对接口请求和响应内容进行加密,密文不能被第三方识别,从而防止接口传输过程中的数据泄露。RSA密钥用于对接口请求和响应内容进行签名,由开发者和支付宝开放平台分别进行签名和验证签名,以确认接口传输的内容未被篡改。不管接口内容是明文还是密文,RSA都可以正常签名。开发者可以先对请求参数进行AES加密,然后对密文进行RSA签名。