RsaUtil.java 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. package com.malk.lianan.utils;
  2. import cn.hutool.core.codec.Base64;
  3. import com.malk.utils.UtilFile;
  4. import org.bouncycastle.jce.provider.BouncyCastleProvider;
  5. import org.jolokia.util.Base64Util;
  6. import java.io.IOException;
  7. import java.io.InputStream;
  8. import java.nio.file.Files;
  9. import java.nio.file.Paths;
  10. import java.security.KeyFactory;
  11. import java.security.PrivateKey;
  12. import java.security.PublicKey;
  13. import java.security.Signature;
  14. import java.security.cert.Certificate;
  15. import java.security.cert.CertificateFactory;
  16. import java.security.cert.X509Certificate;
  17. import java.security.spec.PKCS8EncodedKeySpec;
  18. import java.util.Objects;
  19. public class RsaUtil {
  20. private final static String KEY_RSA = "RSA";
  21. private final static String KEY_RSA_SIGNATURE = "SHA256WithRSA";
  22. private static BouncyCastleProvider bouncyCastleProvider = new BouncyCastleProvider();
  23. private static final String SHA256WithRSA = "SHA256WithRSA";
  24. private static final String X509 = "X.509";
  25. public static String sign(byte[] data, String privateKey) {
  26. String str = "";
  27. try {
  28. // 解密由 base64 编码的私钥
  29. byte[] bytes = decryptBase64(privateKey);
  30. // 构造 PKCS8EncodedKeySpec 对象
  31. PKCS8EncodedKeySpec pkcs = new PKCS8EncodedKeySpec(bytes);
  32. // 指定的加密算法
  33. KeyFactory factory = KeyFactory.getInstance(KEY_RSA,bouncyCastleProvider);
  34. // 取私钥对象
  35. PrivateKey key = factory.generatePrivate(pkcs);
  36. // 用私钥对信息生成数字签名
  37. Signature signature =Signature.getInstance(KEY_RSA_SIGNATURE,bouncyCastleProvider);
  38. signature.initSign(key);
  39. signature.update(data);
  40. str = encryptBase64(signature.sign());
  41. } catch (Exception e) {
  42. e.printStackTrace();
  43. }
  44. return str;
  45. }
  46. //验签
  47. public static boolean verifySign(byte[] data, String sign, String certificatePath) throws Exception {
  48. // 获得证书
  49. // certificatePath 为 cer 证书文件绝对路径
  50. X509Certificate x509Certificate = (X509Certificate) getCertificate(certificatePath);
  51. if (Objects.isNull(x509Certificate)) {
  52. return false;
  53. }
  54. // 获得公钥
  55. PublicKey publicKey = x509Certificate.getPublicKey();
  56. // 构建签名
  57. Signature signature = Signature.getInstance(SHA256WithRSA);
  58. signature.initVerify(publicKey);
  59. signature.update(data);
  60. return signature.verify(Base64Util.decode(sign));
  61. }
  62. private static Certificate getCertificate(String certificatePath) throws Exception {
  63. InputStream in = null;
  64. try {
  65. CertificateFactory certificateFactory = CertificateFactory.getInstance(X509);
  66. // in = Files.newInputStream(Paths.get(certificatePath));
  67. in = UtilFile.readPackageResource(certificatePath);
  68. return certificateFactory.generateCertificate(in);
  69. } catch (Exception e) {
  70. System.out.println(e.getMessage());
  71. } finally {
  72. if (in != null) {
  73. try {
  74. in.close();
  75. } catch (IOException e) {
  76. System.out.println(e.getMessage());
  77. }
  78. }
  79. }
  80. return null;
  81. }
  82. public static Certificate loadCertificate(String relativePathInResources) throws Exception {
  83. // 使用 ClassLoader 获取资源流(路径以 / 开头表示从 classpath 根目录开始)
  84. try (InputStream in = RsaUtil.class.getClassLoader().getResourceAsStream(relativePathInResources)) {
  85. if (in == null) {
  86. throw new IllegalArgumentException("Certificate not found in resources: " + relativePathInResources);
  87. }
  88. CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");
  89. return certificateFactory.generateCertificate(in);
  90. }
  91. }
  92. public static byte[] decryptBase64(String key) throws Exception {
  93. return Base64.decode(key);
  94. }
  95. public static String encryptBase64(byte[] key) throws Exception {
  96. return new String(Base64.encode(key));
  97. }
  98. }