SHA256withRSA证书签名,私钥签名/公钥验签(证书文件加载公私钥)

╰+攻爆jí腚メ 2021-06-11 15:14 1539阅读 0赞

https://www.cnblogs.com/jinzhiming/p/10576385.html

证书签名

复制代码

  1. package test;
  2. import java.io.File;
  3. import java.io.FileInputStream;
  4. import java.io.FileNotFoundException;
  5. import java.io.IOException;
  6. import java.io.InputStream;
  7. import java.security.KeyStore;
  8. import java.security.PrivateKey;
  9. import java.security.PublicKey;
  10. import java.security.Signature;
  11. import java.security.cert.CertificateException;
  12. import java.security.cert.CertificateFactory;
  13. import java.security.cert.X509Certificate;
  14. import java.util.Base64;
  15. import java.util.Enumeration;
  16. /**
  17. * 私钥签名,公钥验签
  18. * @author jinzhm
  19. *
  20. */
  21. public class SignUtil {
  22. private static String CHARSET_ENCODING = "UTF-8";
  23. private static String ALGORITHM = "SHA256withRSA";
  24. /**
  25. * 签名
  26. * @param srcData
  27. * @param privateKeyPath
  28. * @param privateKeyPwd
  29. * @return
  30. */
  31. public static String sign(String srcData, String privateKeyPath, String privateKeyPwd){
  32. if(srcData==null || privateKeyPath==null || privateKeyPwd==null){
  33. return "";
  34. }
  35. try {
  36. // 获取证书的私钥
  37. PrivateKey key = readPrivate(privateKeyPath, privateKeyPwd);
  38. // 进行签名服务
  39. Signature signature = Signature.getInstance(ALGORITHM);
  40. signature.initSign(key);
  41. signature.update(srcData.getBytes(CHARSET_ENCODING));
  42. byte[] signedData = signature.sign();
  43. return Base64.getEncoder().encodeToString(signedData);
  44. } catch (Exception e) {
  45. e.printStackTrace();
  46. }
  47. return "";
  48. }
  49. /**
  50. * 验签
  51. * @param srcData
  52. * @param signedData
  53. * @param publicKeyPath
  54. * @return
  55. */
  56. public static boolean verify(String srcData, String signedData, String publicKeyPath){
  57. if(srcData==null || signedData==null || publicKeyPath==null){
  58. return false;
  59. }
  60. try {
  61. PublicKey publicKey = readPublic(publicKeyPath);
  62. Signature sign = Signature.getInstance(ALGORITHM);
  63. sign.initVerify(publicKey);
  64. sign.update(srcData.getBytes(CHARSET_ENCODING));
  65. return sign.verify(Base64.getDecoder().decode(signedData));
  66. } catch (Exception e) {
  67. e.printStackTrace();
  68. }
  69. return false;
  70. }
  71. /**
  72. * 读取公钥
  73. * @param publicKeyPath
  74. * @return
  75. */
  76. private static PublicKey readPublic(String publicKeyPath){
  77. if(publicKeyPath==null){
  78. return null;
  79. }
  80. PublicKey pk = null;
  81. FileInputStream bais = null;
  82. try {
  83. CertificateFactory certificatefactory = CertificateFactory.getInstance("X.509");
  84. bais = new FileInputStream(publicKeyPath);
  85. X509Certificate cert = (X509Certificate)certificatefactory.generateCertificate(bais);
  86. pk = cert.getPublicKey();
  87. } catch (CertificateException e) {
  88. e.printStackTrace();
  89. } catch (FileNotFoundException e) {
  90. e.printStackTrace();
  91. } finally{
  92. if(bais != null){
  93. try {
  94. bais.close();
  95. } catch (IOException e) {
  96. e.printStackTrace();
  97. }
  98. }
  99. }
  100. return pk;
  101. }
  102. /**
  103. * 读取私钥
  104. * @param path
  105. * @return
  106. */
  107. private static PrivateKey readPrivate(String privateKeyPath, String privateKeyPwd){
  108. if(privateKeyPath==null || privateKeyPwd==null){
  109. return null;
  110. }
  111. InputStream stream = null;
  112. try {
  113. // 获取JKS 服务器私有证书的私钥,取得标准的JKS的 KeyStore实例
  114. KeyStore store = KeyStore.getInstance("JKS");
  115. stream = new FileInputStream(new File(privateKeyPath));
  116. // jks文件密码,根据实际情况修改
  117. store.load(stream, privateKeyPwd.toCharArray());
  118. // 获取jks证书别名
  119. Enumeration en = store.aliases();
  120. String pName = null;
  121. while (en.hasMoreElements()) {
  122. String n = (String) en.nextElement();
  123. if (store.isKeyEntry(n)) {
  124. pName = n;
  125. }
  126. }
  127. // 获取证书的私钥
  128. PrivateKey key = (PrivateKey) store.getKey(pName,
  129. privateKeyPwd.toCharArray());
  130. return key;
  131. } catch (Exception e) {
  132. e.printStackTrace();
  133. } finally {
  134. if(stream != null){
  135. try {
  136. stream.close();
  137. } catch (IOException e) {
  138. e.printStackTrace();
  139. }
  140. }
  141. }
  142. return null;
  143. }
  144. }

复制代码

发表评论

表情:
评论列表 (有 0 条评论,1539人围观)

还没有评论,来说两句吧...

相关阅读