public class MD5Test {
public static void main(String[] args) throws UnsupportedEncodingException {
String s = "123";
byte[] result = getMD5Bytes(s.getBytes());
StringBuilder stringBuilder = new StringBuilder();
for (byte temp : result) {
if (temp >= 0 && temp < 16) {
stringBuilder.append("0");
}
stringBuilder.append(Integer.toHexString(temp & 0xff));
}
System.out.println(s + ",MD5加密后:" + stringBuilder.toString());
}
private static byte[] getMD5Bytes(byte[] content) {
try {
MessageDigest md5 = MessageDigest.getInstance("MD5");
return md5.digest(content);
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException(e);
}
}
}
package pattern;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.security.*;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.PKCS8EncodedKeySpec;
/**
* 加簽驗(yàn)簽demo
* @Author 撿田螺的小男孩
*/
public class SignatureTest {
//公鑰字符串
private static final String PUBLIC_KEY_STR = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDaJzVjC5K6kbS2YE2fiDs6H8pB\n" +
"JFDGEYqqJJC9I3E0Ebr5FsofdImV5eWdBSeADwcR9ppNbpORdZmcX6SipogKx9PX\n" +
"5aAO4GPesroVeOs91xrLEGt/arteW8iSD+ZaGDUVV3+wcEdci/eCvFlc5PUuZJou\n" +
"M2XZaDK4Fg2IRTfDXQIDAQAB";
//私鑰字符串
private static final String PRIVATE_KEY_STR = "MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBANonNWMLkrqRtLZg\n" +
"TZ+IOzofykEkUMYRiqokkL0jcTQRuvkWyh90iZXl5Z0FJ4APBxH2mk1uk5F1mZxf\n" +
"pKKmiArH09floA7gY96yuhV46z3XGssQa39qu15byJIP5loYNRVXf7BwR1yL94K8\n" +
"WVzk9S5kmi4zZdloMrgWDYhFN8NdAgMBAAECgYA9bz1Bn0i68b2KfqRdgOfs/nbe\n" +
"0XNN1DLQp2t7WDfRCg01iI1zPkZgyFVZWtI85f5/uIrLs5ArLosL1oNuqqc0nNne\n" +
"CvJK+ZxvA98Hx3ZqYTzDnleR054YhofL5awbhSciYVic204DOG1rhSsYWMqtX7J7\n" +
"3geoWL7TYdMfYXcCAQJBAPMMKsz6ZJh98EeQ1tDG5gpAGWFQkYNrxZDelP/LjeO0\n" +
"TP3XkQnIpcaZoCs7V/rRGRGMWwQ2BUdc/01in89ZZ5ECQQDlx2oBc1CtOAm2UAhN\n" +
"1xWrPkZWENQ53wTrwXO4qbTGDfBKon0AehLlGCSqxQ71aufLkNO7ZlX0IHTAlnk1\n" +
"TvENAkAGSEQ69CXxgx/Y2beTwfBkR2/gghKg0QJUUkyLqBlMz3ZGAXJwTE1sqr/n\n" +
"HiuSAiGhwH0ByNuuEotO1sPGukrhAkAMK26a2w+nzPL+u+hkrwKPykGRZ1zGH+Cz\n" +
"19AYNKzFXJGgclCqiMydY5T1knBDYUEbj/UW1Mmyn1FvrciHoUG1AkAEMEIuDauz\n" +
"JabEAU08YmZw6OoDGsukRWaPfjOEiVhH88p00veM1R37nwhoDMGyEGXVeVzNPvk7\n" +
"cELg28MSRzCK";
public static void main(String[] args) throws SignatureException, NoSuchAlgorithmException, InvalidKeyException, IOException, InvalidKeySpecException {
//原始報文
String plain = "歡迎大家關(guān)注我的公眾號,撿田螺的小男孩";
//加簽
byte[] signatureByte = sign(plain);
System.out.println("原始報文是:" + plain);
System.out.println("加簽結(jié)果:");
System.out.println(new BASE64Encoder().encode(signatureByte));
//驗(yàn)簽
boolean verifyResult = verify(plain, signatureByte);
System.out.println("驗(yàn)簽結(jié)果:" + verifyResult);
}
/**
* 加簽方法
* @param plain
* @return
* @throws NoSuchAlgorithmException
* @throws InvalidKeyException
* @throws UnsupportedEncodingException
* @throws SignatureException
*/
private static byte[] sign(String plain) throws NoSuchAlgorithmException, InvalidKeyException, UnsupportedEncodingException, SignatureException {
//根據(jù)對應(yīng)算法父叙,獲取簽名對象實(shí)例
Signature signature = Signature.getInstance("SHA256WithRSA");
//獲取私鑰聂沙,加簽用的是私鑰灸促,私鑰一般是在配置文件里面讀的钝的,這里為了演示方便冬三,根據(jù)私鑰字符串生成私鑰對象
PrivateKey privateKey = getPriveteKey(PRIVATE_KEY_STR);
//初始化簽名對象
signature.initSign(privateKey);
//把原始報文更新到對象
signature.update(plain.getBytes("UTF-8"));
//加簽
return signature.sign();
}
/**
* 驗(yàn)簽方法
* @param plain
* @param signatureByte
* @return
* @throws NoSuchAlgorithmException
* @throws InvalidKeyException
* @throws IOException
* @throws SignatureException
* @throws InvalidKeySpecException
*/
private static boolean verify(String plain, byte[] signatureByte) throws NoSuchAlgorithmException, InvalidKeyException, IOException, SignatureException, InvalidKeySpecException {
//獲取公鑰
PublicKey publicKey = getPublicKey(PUBLIC_KEY_STR);
//根據(jù)對應(yīng)算法糖埋,獲取簽名對象實(shí)例
Signature signature = Signature.getInstance("SHA256WithRSA");
//初始化簽名對象
signature.initVerify(publicKey);
//把原始報文更新到簽名對象
signature.update(plain.getBytes("UTF-8"));
//進(jìn)行驗(yàn)簽
return signature.verify(signatureByte);
}
private static PublicKey getPublicKey(String publicKeyStr) throws InvalidKeySpecException, IOException {
PublicKey publicKey = null;
try {
java.security.spec.X509EncodedKeySpec bobPubKeySpec = new java.security.spec.X509EncodedKeySpec(
new BASE64Decoder().decodeBuffer(publicKeyStr));
// RSA對稱加密算法
java.security.KeyFactory keyFactory;
keyFactory = java.security.KeyFactory.getInstance("RSA");
// 生成公鑰對象
publicKey = keyFactory.generatePublic(bobPubKeySpec);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return publicKey;
}
private static PrivateKey getPriveteKey(String privateKeyStr) {
PrivateKey privateKey = null;
PKCS8EncodedKeySpec priPKCS8;
try {
priPKCS8 = new PKCS8EncodedKeySpec(new BASE64Decoder().decodeBuffer(privateKeyStr));
KeyFactory keyf = KeyFactory.getInstance("RSA");
privateKey = keyf.generatePrivate(priPKCS8);
} catch (IOException | NoSuchAlgorithmException | InvalidKeySpecException e) {
e.printStackTrace();
}
return privateKey;
}
}
轉(zhuǎn)自:https://cloud.tencent.com/developer/article/1665989