签名——SHA256-RSA2048
生成私钥、公钥
$ openssl OpenSSL> OpenSSL> OpenSSL> genrsa -out private_key.pem 2048 Generating RSA private key, 2048 bit long modulus (2 primes) ....................................+++++ ......................................................+++++ e is 65537 (0x010001) OpenSSL> OpenSSL> rsa -in private_key.pem -pubout -out public_key.pem writing RSA key OpenSSL> exit
-rw-r--r-- 1 admin 197121 1702 Sep 22 08:16 private_key.pem
-rw-r--r-- 1 admin 197121 460 Sep 22 08:16 public_key.pem
#生成私钥
openssl genrsa -out private_key.pem 2048
生成公钥 openssl rsa -in private_key.pem -pubout -out public_key.pem
#私钥转 PKCS#8 格式 openssl pkcs8 -topk8 -in private_key.pem -out private_key_pkcs8.pem -nocrypt
应用私钥对待签名串进行SHA256-RSA2048签名,并对签名结果进行Base64编码得到签名值。
Java类
package com.utils;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.security.KeyFactory;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.Signature;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.Base64;
/**
 * SHA256RSA 签名、验签
 */
public class Sha256RsaUtil {
    public static String sign(byte[] privateKeyBytes, String data) throws Exception {
        // 读取私钥文件
        byte[] keyBytes = privateKeyBytes;
        PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes);
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
        PrivateKey privateKey = keyFactory.generatePrivate(keySpec);
        // 对数据进行 SHA256-RSA2048 签名
        Signature signature = Signature.getInstance("SHA256withRSA");
        signature.initSign(privateKey);
        signature.update(data.getBytes(StandardCharsets.UTF_8));
        byte[] signBytes = signature.sign();
        // 对签名结果进行 Base64 编码
        return Base64.getEncoder().encodeToString(signBytes);
    }
    public static boolean verify(byte[] publicKeyBytes, String responseData, String byteSignature) throws Exception {
        // 读取公钥文件
        byte[] keyBytes = publicKeyBytes;
        X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
        PublicKey publicKey = keyFactory.generatePublic(keySpec);
        // 分割应答数据
        String[] responseParts = responseData.split("\n");
        String responseTimestamp = responseParts[0];
        String responseNonceStr = responseParts[1];
        String responseBody = responseParts[2];
        // 构造待验签数据
        String unsignedString = responseTimestamp + "\n" + responseNonceStr + "\n" + responseBody;
        // 解码签名值
        byte[] signBytes = Base64.getDecoder().decode(byteSignature.getBytes());
        // 验证签名
        Signature signature = Signature.getInstance("SHA256withRSA");
        signature.initVerify(publicKey);
        signature.update(unsignedString.getBytes(StandardCharsets.UTF_8));
        return signature.verify(signBytes);
    }
}
 
                    
                
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号