RSASignature.java 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. package cn.efunbox.base.util;
  2. import org.apache.commons.codec.binary.Base64;
  3. import org.bouncycastle.util.encoders.UrlBase64;
  4. import java.io.ByteArrayInputStream;
  5. import java.io.InputStream;
  6. import java.security.KeyFactory;
  7. import java.security.PrivateKey;
  8. import java.security.PublicKey;
  9. import java.security.Signature;
  10. import java.security.cert.Certificate;
  11. import java.security.cert.CertificateFactory;
  12. import java.security.spec.PKCS8EncodedKeySpec;
  13. import java.security.spec.X509EncodedKeySpec;
  14. public class RSASignature {
  15. public static final String KEY_ALGORITHM = "RSA";
  16. public static final String SIGNATURE_ALGORITHM = "SHA1WithRSA";
  17. public static final String ENCODING = "utf-8";
  18. public static final String X509 = "X.509";
  19. /**
  20. * query RSA private key
  21. *
  22. * @param key
  23. * @return
  24. * @throws Exception
  25. */
  26. public static PrivateKey getPrivateKey(String key) throws Exception {
  27. byte[] keyBytes = Base64.decodeBase64(key.getBytes(ENCODING));
  28. PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes);
  29. KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
  30. PrivateKey privateKey = keyFactory.generatePrivate(keySpec);
  31. return privateKey;
  32. }
  33. /**
  34. * query RSA public key
  35. *
  36. * @param key
  37. * @return
  38. * @throws Exception
  39. */
  40. public static PublicKey getPublicKey(String key) throws Exception {
  41. byte[] keyBytes = Base64.decodeBase64(key.getBytes(ENCODING));
  42. CertificateFactory certificateFactory = CertificateFactory.getInstance(X509);
  43. InputStream in = new ByteArrayInputStream(keyBytes);
  44. Certificate certificate = certificateFactory.generateCertificate(in);
  45. PublicKey publicKey = certificate.getPublicKey();
  46. return publicKey;
  47. }
  48. /**
  49. * sign by private key
  50. *
  51. * @param content
  52. * content data which will be signed
  53. * @param privateKey
  54. * private key data
  55. * @return signed data
  56. */
  57. public static String signByPrivateKey(String content, String privateKey) {
  58. return signByPrivateKey(content, privateKey, true);
  59. }
  60. public static boolean verifySignByPublicKey(String content, String sign, String publicKey) {
  61. return verifySignByPublicKey(content, sign, publicKey, true);
  62. }
  63. public static String signByPrivateKey(String content, String privateKey, boolean useUrlBase64) {
  64. try {
  65. PrivateKey priKey = getPrivateKey(privateKey);
  66. Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);
  67. signature.initSign(priKey);
  68. signature.update(content.getBytes(ENCODING));
  69. byte[] signed = signature.sign();
  70. if (useUrlBase64) {
  71. return new String(UrlBase64.encode(signed), ENCODING);
  72. } else {
  73. return new String(Base64.encodeBase64(signed), ENCODING);
  74. }
  75. } catch (Exception e) {
  76. //ignore exception
  77. }
  78. return null;
  79. }
  80. public static boolean verifySignByPublicKey(String content, String sign, String publicKey, boolean useUrlBase64) {
  81. try {
  82. KeyFactory keyFactory = KeyFactory.getInstance("RSA");
  83. byte[] encodedKey = Base64.decodeBase64(publicKey.getBytes(ENCODING));
  84. PublicKey pubKey = keyFactory.generatePublic(new X509EncodedKeySpec(encodedKey));
  85. Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);
  86. signature.initVerify(pubKey);
  87. signature.update(content.getBytes(ENCODING));
  88. if (useUrlBase64) {
  89. return signature.verify(UrlBase64.decode(sign.getBytes(ENCODING)));
  90. } else {
  91. return signature.verify(Base64.decodeBase64(sign.getBytes(ENCODING)));
  92. }
  93. } catch (Exception e) {
  94. // ignore exception
  95. }
  96. return false;
  97. }
  98. }