RSA 签名和验签实例,结合http请求和调用三方接口java
时间: 2024-10-14 18:04:17 浏览: 22
Java 实现RSA 签名/验签与加密解密
RSA (Rivest-Shamir-Adleman) 算法是一种非对称加密技术,它包括两个密钥:公钥和私钥。在数字签名中,RSA 被广泛用于保证消息的完整性和发送者的身份。
**RSA签名示例**:
假设你在 Java 中需要使用 RSA 对 HTTP 请求进行签名:
1. **生成密钥对**:
- 使用 `java.security.KeyPairGenerator` 类生成一对 RSA 密钥(公钥和私钥)。
```java
KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
keyGen.initialize(2048); // 选择合适的密钥长度
KeyPair keyPair = keyGen.generateKeyPair();
PublicKey publicKey = keyPair.getPublic();
PrivateKey privateKey = keyPair.getPrivate();
```
2. **准备数据**:
- 将要发送的数据(如 HTTP 请求体)转换为字节数组。
3. **进行签名**:
- 使用发送方的私钥对数据进行签名,生成一个数字签名(Signature object)。
```java
Signature signer = Signature.getInstance("SHA256withRSA");
signer.initSign(privateKey);
signer.update(data.getBytes(StandardCharsets.UTF_8));
byte[] signatureBytes = signer.sign();
```
4. **附上签名**:
- 将签名数据附加到原始 HTTP 请求头(通常使用 "Signature" 或 "X-RSA-Signature" 键)。
**验证签名**:
接收端收到请求后,会做类似的操作:
1. **提取数据和签名**:
- 从请求中获取数据和签名。
2. **校验签名**:
- 使用接收方的公钥解密签名,然后用同样的算法和哈希函数计算原始数据的哈希值。
- 比较接收到的签名和计算出的哈希值,如果匹配,则证明数据未被篡改,且确实来自指定的发送者。
```java
Signature verifier = Signature.getInstance("SHA256withRSA");
verifier.initVerify(publicKey);
verifier.update(receivedData.getBytes(StandardCharsets.UTF_8));
boolean isValid = verifier.verify(signatureBytes);
```
阅读全文