package com.learn.util;
import org.apache.commons.codec.binary.Base64;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.security.*;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
public class RSAUtil {
static Logger LOG = LoggerFactory.getLogger(RSAUtil.class);
private static final String SIGNATURE_ALGORITHM = "SHA1withRSA"; //签名算法
private static final String KEY_ALGORITHM = "RSA"; //加密算法RSA
/**
* 公钥验签
*
* @param text 原字符串
* @param sign 签名结果
* @param publicKey 公钥
* @return 验签结果
*/
public static boolean verify(String text, String sign, String publicKey) {
try {
Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);
PublicKey key = KeyFactory.getInstance(KEY_ALGORITHM).generatePublic(new X509EncodedKeySpec(Base64.decodeBase64(publicKey)));
signature.initVerify(key);
signature.update(text.getBytes());
return signature.verify(Base64.decodeBase64(sign));
} catch (Exception e) {
LOG.error("验签失败:text={},sign={}", text, sign, e);
}
return false;
}
/**
* 签名字符串
*
* @param text 需要签名的字符串
* @param privateKey 私钥(BASE64编码)
* @return 签名结果(BASE64编码)
*/
public static String sign(String text, String privateKey) {
byte[] keyBytes = Base64.decodeBase64(privateKey);
PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);
try {
KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
PrivateKey privateK = keyFactory.generatePrivate(pkcs8KeySpec);
Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);
signature.initSign(privateK);
signature.update(text.getBytes());
byte[] result = signature.sign();
return Base64.encodeBase64String(result);
} catch (Exception e) {
LOG.error("签名失败,text={}", text, e);
}
return null;
}
}
package com.learn.util;
import org.junit.Test;
/**
* 测试加签验签
*/
public class RSAUtilTest {
static final String publicKey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDovNC1bzzZ3lu//xLUIud8a8Fu\n" +
"bvgXVxFu7Z3jbBjc3thot8gIrpZt951MkdfcUK091kHiDmwiAnMkDJvZI1Y9cWcF\n" +
"gyKjczR1iDusUTPMGwHkligBx4ocVyoREz8mC0JliSnn8OKhutvnegyFsDI5lVuV\n" +
"ZyFQPGbzvXtYIJ+cBwIDAQAB";
static final String privateKey = "MIICeAIBADANBgkqhkiG9w0BAQEFAASCAmIwggJeAgEAAoGBAOi80LVvPNneW7//\n" +
"EtQi53xrwW5u+BdXEW7tneNsGNze2Gi3yAiulm33nUyR19xQrT3WQeIObCICcyQM\n" +
"m9kjVj1xZwWDIqNzNHWIO6xRM8wbAeSWKAHHihxXKhETPyYLQmWJKefw4qG62+d6\n" +
"DIWwMjmVW5VnIVA8ZvO9e1ggn5wHAgMBAAECgYEA5Zkn2GWVxWUcZGtxmr+YWGFB\n" +
"YP2uV/A4LZPSuAHzASoCmkP73bzGgFPP5TLXnewlDCTrt+P8fwylpEGgGfVHY9Jj\n" +
"xYFFIqcLN7pjZDvIB6sUv7puV+OisyqcmpiwLyyG0pfhoAWnSwvoO8IPft9dOLO4\n" +
"0GikdRRymqgZbMMzQAkCQQD4wnQa7A4KRwMn1AC3R46sw4uz4F2YFSMM1r2PsQP6\n" +
"Z4DPNeqb7V4iMBN3O8lZP5Mr4dBSblz5k0+Xq+Tzr4u7AkEA74L6qDOnYbzGusAs\n" +
"PneGZ9bXDktix+IjA+7BalZe3dwAbc0bUBcozxMy5MrtXzYO2cOPeFO5FD1EXr/D\n" +
"NFmeJQJBAKCOCRgTQWCawsujBq9ErS6Oq412g5IUGmI/+2tRygqFYVrcJsdrJfWU\n" +
"6Att+B/1a4zIG4gImVOwI4/2LzilFd8CQBvO0D1hKejeGxCpqTljdTZvKi7dr81X\n" +
"Qwt81/X5qzAFEAOvkaE93x4Ts4/+w4qPYzADVY/54H4qEtsRVp+oXAUCQQDO2uuT\n" +
"s8rPZ4Et/fiJAdeUpgW9J5Wiu6hCkZXPXfYcii8cxUMQzXWgy8WPjWUXHGfFQii5\n" +
"YFFM9D047GDim3Dp";
@Test
public void signTest(){
String text = "{\"amount\":10,\"chanId\":\"111\",\"chanUserId\":\"123\",\"createAt\":\"2017-01-01 13:26:48\",\"memo\":\"string\",\"outerOrderId\":\"10001\",\"productId\":\"001\"}";
String sign = RSAUtil.sign(text,privateKey);
System.out.println(sign);
System.out.println(RSAUtil.verify(text, sign, publicKey));
}
}