RSA应用

RSA两种用法

公钥加密,私钥解密

在标准的 RSA 加密中,通常是使用公钥对数据进行加密,然后使用私钥进行解密。这样做的原因是,公钥是公开的,任何人都可以获得,而私钥是保密的,只有持有者才能访问。

这样操作目的是传输信息

私钥签名,公钥验签

但是也可以反过来操作,私钥加密(签名),公钥验签

这种操作目的是验证身份

例如:

import java.security.*;
import java.util.Base64;

public class RSASignatureDemo {
    public static void main(String[] args) throws Exception {
        // 生成RSA密钥对
        KeyPair keyPair = generateKeyPair();

        // 待签名的数据
        String data = "Hello, world!";

        // 使用私钥对数据进行签名
        byte[] signature = sign(data, keyPair.getPrivate());
        System.out.println("Signature: " + Base64.getEncoder().encodeToString(signature));

        // 使用公钥验证签名
        boolean isValid = verify(data, signature, keyPair.getPublic());
        System.out.println("Signature is valid: " + isValid);
    }

    // 生成RSA密钥对
    public static KeyPair generateKeyPair() throws Exception {
        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
        keyPairGenerator.initialize(2048); // 密钥长度为2048位
        return keyPairGenerator.generateKeyPair();
    }

    // 使用私钥对数据进行签名
    public static byte[] sign(String data, PrivateKey privateKey) throws Exception {
        Signature signature = Signature.getInstance("SHA256withRSA");
        signature.initSign(privateKey);
        signature.update(data.getBytes());
        return signature.sign();
    }

    // 使用公钥验证签名
    public static boolean verify(String data, byte[] signature, PublicKey publicKey) throws Exception {
        Signature sig = Signature.getInstance("SHA256withRSA");
        sig.initVerify(publicKey);
        sig.update(data.getBytes());
        return sig.verify(signature);
    }
}


在微信支付中的应用

以下所述针对V3版本API

安全机制

微信支付使用商户的消息签名验证商户的身份。如果一个请求不包含签名或者签名验证失败,微信支付将返回身份验证错误。它背后的技术是:数字签名技术。
数字签名(亦称公钥数字签名)是一种独特的数字串,只能由信息发送者生成,且无法被他人伪造。它有效地证明了发送者发送信息的真实性。数字签名类似于纸上的普通物理签名,但采用了公钥加密技术来实现,用于验证数字信息的真实性。数字签名系统通常包含两种互补操作:一种用于生成签名,另一种用于验证签名。

商户请求微信支付

每个商户都拥有自己的商户API证书私钥,在发送请求时,商户需要使用这个私钥对消息进行签名。 当微信支付侧收到请求后,会使用对应的商户API证书公钥对签名进行验证(即验签)。只有当验签成功后,微信支付才会确认消息发送者的身份是真实的。
如果有敏感字段需要上送,则用微信支付的平台证书公钥对字段进行加密。微信支付收到后,会使用平台证书私钥解密。
示意图如下:
在这里插入图片描述

顺序为:

  1. 商户构造原始请求。
  2. 商户使用平台证书公钥对请求中的敏感字段进行加密,得到新的请求包体,注意是对敏感字段加密,而非整个原始请求,详情见:敏感数据加密。
  3. 商户使用商户API私钥对请求包体计算签名,详情见:生成签名。
  4. 商户将请求包体和签名上送到微信支付。
  5. 微信支付使用商户API证书公钥对请求包体进行验签。
  6. 微信支付使用平台私钥对请求中的敏感字段进行解密,得到原始请求,随后开始处理业务。

微信支付应答商户

微信支付给商户应答时,机制和商户请求微信支付类似,只是签名的私钥换成了微信支付平台私钥,加密的公钥换成了商户API证书公钥。
示意图如下:
在这里插入图片描述

顺序为:

  1. 微信支付构造原始应答。
  2. 微信支付使用商户API证书公钥对应答中的敏感字段进行加密,得到新的应答包体。
  3. 微信支付使用平台私钥对应答包体计算签名。
  4. 微信支付将应答包体和签名返回给商户。
    商户收到应答后,应使用微信支付平台证书公钥进行验签,以校验应答者的身份真实性。详情见:验证签名。
    如果应答中包含敏感字段,应使用商户API证书私钥进行解密。详情见:敏感数据加密

微信支付回调商户

微信支付回调商户时,与前述略有不同,主要体现在加密和签名的源串不同。
示意图如下:
在这里插入图片描述

其顺序为:

  1. 微信支付构造原始请求
  2. 微信支付使用APIv3密钥对原始请求进行加密,得到新的请求包体(注意:APIv3密钥是一个对称密钥,由商户在商户平台设置)
  3. 微信支付使用平台证书私钥对原始请求计算签名
  4. 微信支付将请求包体和签名上送到商户
  5. 商户使用APIv3密钥对请求包体进行解密,得到原始请求
  6. 商户使用平台证书公钥对原始请求进行验签,验签通过后开始处理业务
    详细的解密方法见:回调解密

引用:https://pay.weixin.qq.com/docs/merchant/development/interface-rules/api-security-introduction.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值