「Java工具類」rsa非對稱加密java非對稱加密rsa工具類
介紹語
本號主要是Java常用關鍵技術點,通用工具類的分享;以及springboot+springcloud+Mybatisplus+druid+mysql+redis+swagger+maven+docker等集成框架的技術分享;datax、kafka、flink等大數據處理框架的技術分享。文章會不斷更新,歡迎碼友關注點贊收藏轉發!
望各位碼友點擊關注,沖1000粉。后面會錄制一些視頻教程,圖文和視頻結合,比如:圖書介紹網站系統、搶購系統、大數據中臺系統等。技術才是程序猿的最愛,碼友們沖啊
如果碼友覺得代碼太長,可以從頭到尾快速掃射一遍,了解大概即可。覺得有用后再轉發收藏,以備不時之需。
正文:
前面發了一篇aes對稱加密工具類,深得碼友信賴,幫助我轉發,非常感謝碼友。今天再給出一篇rsa非對稱加密工具類。在java中對稱加密和非對稱加密都是常用的,一般情況下對稱加密用于大量數據加密,比rsa快;而rsa一般用于特別重要的小量數據加密,例如密碼等可以用rsa加密,把公鑰給客戶端,密碼使用md5加密,然后再使用公鑰進行加密,最后傳輸到后端,后端使用私鑰解密,得到密碼的md5值,最后與庫中密碼比較,相等則登錄成功,反之登錄錯誤。
rsa的公鑰私鑰,一般不會每次都生成,而是生成后存儲在文件中或者存儲在數據庫中,可多次使用。
使用例子
import com.javabage.tools.utils.RSAEncryptUtil;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
?
import javax.crypto.BadPaddingException;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.spec.InvalidKeySpecException;
?
public class RSAEncryptUtilTest {
?
private static final Logger logger = LoggerFactory.getLogger(RSAEncryptUtilTest.class);
?
@Test
public void rsaTest() throws NoSuchAlgorithmException, NoSuchPaddingException, IllegalBlockSizeException,
InvalidKeySpecException, BadPaddingException, InvalidKeyException {
// 生成公鑰和私鑰
RSAEncryptUtil.genKeyPair();
?
logger.info("公鑰為:{}", RSAEncryptUtil.getRSAPublicKey());
logger.info("私鑰為:{}", RSAEncryptUtil.getRSAPrivateKey());
?
// 加密字符串,用公鑰加密,用私鑰解密
String message = "kd35734j74kjffy9r";
logger.info("待加密字符串:{}", message);
String messageEn = RSAEncryptUtil.encrypt(message, RSAEncryptUtil.getRSAPublicKey());
logger.info("公鑰加密后的字符串為:{}", messageEn);
String messageDe = RSAEncryptUtil.decrypt(messageEn, RSAEncryptUtil.getRSAPrivateKey());
logger.info("私鑰解密還原后的字符串為:{}", messageDe);
}
}
?
// 控制臺輸出
23:57:58.822 [main] INFO - 公鑰為:MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnm4rf1ukashv7J+mtLyOyVfK7vZxHtNxaUJxfkGnVVOrI/M5fNhHNfl6wtUi8XislP7t5/sF4zdJgLDZ4reIma8SVueaSX85Ts/bXMLBUvVk/noSzhD3Fa+qSpcgv59NlWNNJclssZFK2bRS6NOdmIIWP/V+Ld25RrKZDahxu6dPldFPgEXAhS7C3LgdoAwTsNTAqDgPYVscVStXtFCudFWyNrVhmzCHTfSRF5+CbPH+HlnmoLje+s0pY9eVA46QKCzYVstjFarnPh4TdqRb4CQ51KEFBgyaRiNSrCskbpgZDtPjSlfdjqy48UU4fei7w9PVF34e+g8PYSwS9OPX5wIDAQAB
23:57:58.823 [main] INFO - 私鑰為:MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCebit/W6RqyG/sn6a0vI7JV8ru9nEe03FpQnF+QadVU6sj8zl82Ec1+XrC1SLxeKyU/u3n+wXjN0mAsNnit4iZrxJW55pJfzlOz9tcwsFS9WT+ehLOEPcVr6pKlyC/n02VY00lyWyxkUrZtFLo052YghY/9X4t3blGspkNqHG7p0+V0U+ARcCFLsLcuB2gDBOw1MCoOA9hWxxVK1e0UK50VbI2tWGbMIdN9JEXn4Js8f4eWeaguN76zSlj15UDjpAoLNhWy2MVquc+HhN2pFvgJDnUoQUGDJpGI1KsKyRumBkO0+NKV92OrLjxRTh96LvD09UXfh76Dw9hLBL049fnAgMBAAECggEBAJotmMMOSglpGhLqo29L+KDUgTbgOeHH35yR/qTh+5g8HlaUAqQOTe6m5OLqTGE2EK3HEXsqfOZMDYnhkYjjF1qIV46fQTS5TOn3ugChv0WebjSAVACZ3fsKwuxn+oTA4N26j39wcAi13mPS6sSN+9ZI8qI3pB26ou28LNpvzI7SkbMmaDwmKWtPvzxSipwHshdHno6fm72LSKqGRm49w0hEkZcjuLJG+l4Y9V0o57q7ENUZU8kDIyDi9PvzVO78T565pjLQoa7ePt29M2PUZM5/EhaiHM/QWjQnozd97wZPf6yB/B9OPxGyK0s1qcZAQ95dXywQ/8PO3xK0DZ4myzECgYEAzqrMK2XbrM5gDxzgAXAzapwq4AZBg9ZU1+U2VX2zjv5DUlWDDPvK4bUQstGGdH7EGJCYcddayhqwpcqdN5gsVna/hxwdrUemgYiaJ701WRQ1dhFsHidEWt4JikuSlGPNQIt7CzKFD9wocuRWZndeTUnSM8PRIxyFRXyEUlUMr0MCgYEAxD+sXREJR2pgraXf/2u7m3INfNZoh/EkgeQqFb42GnvcRoNKJE2UHAULQUnvISJr23x0fVvlZfsNcDMav2oDkxpi0joQqt1kCskkpEvlAGzBSNt9dbGnLEIY92ZhINj0EZ14lWy1WxmdBP7O3Zof4KFKJ9XvU59gRerGqIo+cI0CgYBryBGw9G9LwVnBp/p/ZYe7KvUFXt3eJvKaofTjQypZAewUTXqKU+rsKaUqzTFFIjOc6BRJEtpLmv3TiUbTDq7Y7RdYHGaxzzNcTOSwovHmoi57g/ySAUKZ7UCmemFYuG/8IIIsRc21hsklmkYhLFHnFv/kdVRl7mLm6ViNI8P4xwKBgE9zB7DVyM/kvScP1FNvphAUaGl10/PVKFZ9rJwI2ZZ3NoJFfKqdzaxaTmgsKmdbrBa7l914arKSpKobxmRf4vqW4BMD9uN1pZ7IN9Fb+GXnoYiBc5VGSsucJsdh50iJDKZk/gBgdjtfbzYqgk0srGMgaQkfjzhneW5U0gBBl22xAoGBAMwuQSyDIynhiXZadhfkDr02ThZTAhG34J0+KdqDMjHHlMYCsq0chYZ8cNyES2E9UClui05WUL6tK7mzzBrUku8XsdlHAONA2YOCUdW9metjRldX9PfVXNcctFem9l3X07dV8Kv2CaF0V2GXYxWoik1QNmItVV/aP9DUCOriD2tn
23:57:58.823 [main] INFO - 待加密字符串:kd35734j74kjffy9r
23:57:59.979 [main] INFO - 公鑰加密后的字符串為:kpa3L/GH0RUyGUmFojEeLfHxzs1EU2/Pn9to6JaUKqo1HH3o7jk6ETrhyblfQ5pjE5Ic20NiUJokAHN6EYjpBofR8XT9WdzPiW2cdUf9OLVazFyKm8wOzESzpfF+BTx67Sy7pQUxVJgUXasjdjAAElyCtxzV69/Tk03+gbIhoeGQELn//7fsA3wXJqMQLrXhbXT6vN4a0ya3D8UYiIyT3upWQUHlABEfmx63nXOaigvqjBTOunyuHSMSOYaNIC4bvkhWTQIaotWPvDy9Ra9lvmOwbRg/FvU/QYjYxWYEYz5EYeNCGiKG477E5eGW8xs1LVyqkPbqMsmovYgrvWk5PQ==
23:57:59.986 [main] INFO - 私鑰解密還原后的字符串為:kd35734j74kjffy9r
工具類源碼:
import org.apache.commons.codec.binary.Base64;
?
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import java.nio.charset.StandardCharsets;
import java.security.*;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.HashMap;
import java.util.Map;
?
/**
* rsa工具類
*
* @author liangxn
*/
public class RSAEncryptUtil {
?
private static final Map<String, String> KEY_MAP = new HashMap<>();
?
private RSAEncryptUtil() {
}
?
/**
* 隨機生成密鑰對
*
* @throws NoSuchAlgorithmException
*/
public static void genKeyPair() throws NoSuchAlgorithmException {
// 密鑰生成器
KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA");
// 設置為2048位長度
generator.initialize(2048, new SecureRandom());
// 生成密鑰對
KeyPair keyPair = generator.generateKeyPair();
// 獲取私鑰
RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
// 獲取公鑰
RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
// 進行64位編碼得到公鑰的字符串
String publicKeyString = new String(Base64.encodeBase64(publicKey.getEncoded()));
// 進行64位編碼得到私鑰的字符串
String privateKeyString = new String(Base64.encodeBase64((privateKey.getEncoded())));
// 將公鑰和私鑰保存到Map
KEY_MAP.put("publicKey", publicKeyString);
KEY_MAP.put("privateKey", privateKeyString);
}
?
/**
* RSA公鑰加密
*
* @param source 待加密字符串
* @param publicKey 公鑰
* @return 加密后的字符串
* @throws Exception 加密過程中的異常信息
*/
public static String encrypt(String source, String publicKey) throws NoSuchAlgorithmException,
InvalidKeySpecException,
NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException {
// 把字符串轉成字節
byte[] decoded = Base64.decodeBase64(publicKey);
RSAPublicKey pubKey = (RSAPublicKey) KeyFactory.getInstance("RSA")
.generatePublic(new X509EncodedKeySpec(decoded));
// rsa實例
Cipher cipher = Cipher.getInstance("RSA");
// 加密模式為加密,然后加密
cipher.init(Cipher.ENCRYPT_MODE, pubKey);
return Base64.encodeBase64String(cipher.doFinal(source.getBytes(StandardCharsets.UTF_8)));
}
?
/**
* RSA私鑰解密
*
* @param encText 加密字符串
* @param privateKey 私鑰
* @return 解密后的字符串
* @throws Exception 解密過程中的異常信息
*/
public static String decrypt(String encText, String privateKey) throws NoSuchAlgorithmException,
InvalidKeySpecException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException,
BadPaddingException {
// 把字符串轉成字節
byte[] inputByte = Base64.decodeBase64(encText.getBytes(StandardCharsets.UTF_8));
byte[] decoded = Base64.decodeBase64(privateKey);
// 獲取rsa密鑰實例
RSAPrivateKey priKey = (RSAPrivateKey) KeyFactory.getInstance("RSA")
.generatePrivate(new PKCS8EncodedKeySpec(decoded));
// rsa實例
Cipher cipher = Cipher.getInstance("RSA");
// 加密模式為解密,然后解密
cipher.init(Cipher.DECRYPT_MODE, priKey);
return new String(cipher.doFinal(inputByte));
}
?
public static String getRSAPrivateKey() {
return KEY_MAP.get("privateKey");
}
?
public static String getRSAPublicKey() {
return KEY_MAP.get("publicKey");
}
?
}
鄙人編碼十年多,在項目中也積累了一些工具類,很多工具類在每個項目都有在用,很實用。大部分是鄙人封裝的,有些工具類是同事封裝的,有些工具類已經不記得是ctrl+c的還是自己封裝的了,現在有空就會總結項目中大部分的工具類,分享給各位碼友。如果文章中涉及的代碼有侵權行為請通知鄙人處理。
計劃是先把工具類整理出來,正所謂工欲善其事,必先利其器。項目中不管是普通單體項目還是多模塊maven項目或是分布式微服務,一部分功能模塊都是可以重用的,工具類模塊就是其中之一。

浙公網安備 33010602011771號