最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java使用RSA工具進(jìn)行信息加解密

 更新時間:2023年12月17日 11:32:34   作者:大白貓~  
我們在開發(fā)中需要對用戶敏感數(shù)據(jù)進(jìn)行加解密,比如密碼等信息,這篇文章主要為大家詳細(xì)介紹了java如何使用RSA工具進(jìn)行信息加解密,感興趣的小伙伴可以了解下

我們在開發(fā)中需要對用戶敏感數(shù)據(jù)進(jìn)行加解密,比如密碼

這邊科普一下RSA算法

RSA是非對稱加密算法,與對稱加密算法不同;在對稱加密中,相同的密鑰用于加密和解密數(shù)據(jù),因此密鑰的安全性至關(guān)重要;而在RSA非對稱加密中,有兩個密鑰,一個是公鑰,用于加密數(shù)據(jù),另一個是私鑰,用于解密數(shù)據(jù);這意味著公鑰可以公開分發(fā),而私鑰必須保持秘密;

RSA非對稱加密的主要應(yīng)用包括:

數(shù)據(jù)加密:使用接收者的公鑰加密數(shù)據(jù),只有擁有相應(yīng)私鑰的接收者才能解密;

數(shù)字簽名:使用發(fā)送者的私鑰對數(shù)據(jù)簽名,接收者可以使用發(fā)送者的公鑰驗證簽名,確保數(shù)據(jù)的完整性和來源的真實性;

密鑰協(xié)商:RSA也用于安全協(xié)議中,如TLS/SSL,用于安全地交換對稱加密密鑰,從而實現(xiàn)保密通信;

非對稱加密算法提供了更高的安全性,因為加密和解密使用不同的密鑰,攻擊者無法從公鑰推導(dǎo)出私鑰;但由于非對稱加密計算成本高昂,通常不用于大規(guī)模數(shù)據(jù)的加密,而是用于安全協(xié)商和數(shù)字簽名等場景

今天就實現(xiàn)了一個RSA工具類,可以很輕松的對數(shù)據(jù)進(jìn)行加解密

不需要加依賴,代碼如下

public class RSAUtils {
 
    /**
     * @param plaintext 要加密的字符串
     * @param publicKeyStr 傳入的公鑰,是一個字符串
     * @return 加密后的字符串, 以Base64編碼的形式返回
     * @throws Exception 異常
     * 這個方法接受一個要加密的字符串和一個公鑰字符串,使用公鑰進(jìn)行加密,然后返回加密后的字符串
     */
    public static String encrypt(String plaintext, String publicKeyStr) throws Exception {
        PublicKey publicKey = getPublicKeyFromString(publicKeyStr);
 
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.ENCRYPT_MODE, publicKey);
 
        byte[] encryptedBytes = cipher.doFinal(plaintext.getBytes());
        return Base64.getEncoder().encodeToString(encryptedBytes);
    }
 
 
    /**
     * @param encryptedText 要解密的字符串
     * @param privateKeyStr 傳入的私鑰,是一個字符串
     * @return 解密后的原始字符串
     * @throws Exception 異常
     * 這個方法接受一個要解密的字符串和一個私鑰字符串,使用私鑰進(jìn)行解密,然后返回解密后的原始字符串
     */
    public static String decrypt(String encryptedText, String privateKeyStr) throws Exception {
        PrivateKey privateKey = getPrivateKeyFromString(privateKeyStr);
 
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.DECRYPT_MODE, privateKey);
 
        byte[] encryptedBytes = Base64.getDecoder().decode(encryptedText);
        byte[] decryptedBytes = cipher.doFinal(encryptedBytes);
        return new String(decryptedBytes);
    }
 
    /**
     * @return
     * @throws Exception
     * 隨機(jī)生成一個長度為2048的RSA公私鑰對
     */
    public static KeyPair generateKeyPair() throws Exception {
        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
        keyPairGenerator.initialize(2048);
        return keyPairGenerator.generateKeyPair();
    }
 
    /**
     * @param publicKey
     * @return
     * 拿出剛生成Base64格式的私鑰對的公鑰字符串
     */
    public static String publicKeyToString(PublicKey publicKey) {
        return Base64.getEncoder().encodeToString(publicKey.getEncoded());
    }
 
    /**
     * @param privateKey
     * @return
     * 拿出剛生成Base64格式的私鑰對的私鑰字符串
     */
    public static String privateKeyToString(PrivateKey privateKey) {
        return Base64.getEncoder().encodeToString(privateKey.getEncoded());
    }
 
    /**
     * @param publicKeyStr
     * @return 公鑰私鑰對象
     * @throws Exception
     * 將剛拿出的Base64格式的私鑰對的私鑰字符串生成公鑰對象
     */
    public static PublicKey getPublicKeyFromString(String publicKeyStr) throws Exception {
        byte[] publicKeyBytes = Base64.getDecoder().decode(publicKeyStr);
        X509EncodedKeySpec spec = new X509EncodedKeySpec(publicKeyBytes);
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
        return keyFactory.generatePublic(spec);
    }
 
    /**
     * @param privateKeyStr
     * @return
     * @throws Exception
     * 將剛拿出的Base64格式的私鑰對的私鑰字符串生成私鑰對象
     */
    public static PrivateKey getPrivateKeyFromString(String privateKeyStr) throws Exception {
        byte[] privateKeyBytes = Base64.getDecoder().decode(privateKeyStr);
        PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(privateKeyBytes);
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
        return keyFactory.generatePrivate(spec);
    }
 
    public static void main(String[] args) throws Exception {
        // 生成RSA密鑰對
        KeyPair keyPair = generateKeyPair();
        PublicKey publicKey = keyPair.getPublic();
        PrivateKey privateKey = keyPair.getPrivate();
 
        // 將公鑰和私鑰轉(zhuǎn)換為字符串
        String publicKeyStr = publicKeyToString(publicKey);
        String privateKeyStr = privateKeyToString(privateKey);
 
        System.out.println("公鑰: " + publicKeyStr);
        System.out.println("私鑰: " + privateKeyStr);
 
        // 加密和解密測試
        String plaintext = "大白貓真厲害";
        String encryptedText = encrypt(plaintext, publicKeyStr);
        System.out.println("加密后的子串: " + encryptedText);
 
        String decryptedText = decrypt(encryptedText, privateKeyStr);
        System.out.println("解密后的子串: " + decryptedText);
    }
}

結(jié)果如下

將數(shù)據(jù)用公鑰加密,用私鑰解密,這樣就可以了

到此這篇關(guān)于java使用RSA工具進(jìn)行信息加解密的文章就介紹到這了,更多相關(guān)java RSA信息加解密內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java?Spring?循環(huán)依賴解析

    Java?Spring?循環(huán)依賴解析

    這篇文章主要介紹了Java?Spring?循環(huán)依賴解析,Spring?現(xiàn)在其實是我們?Java?程序開發(fā)離不開的基礎(chǔ)框架,個人覺得除了?JDK?我們用得最多的?Java?中間件就是?Spring?,今天我們一起來學(xué)習(xí)一下?Spring?的循環(huán)依賴。下面詳細(xì)內(nèi)容需要的小伙伴可以參考一下
    2022-02-02
  • Java中JDom解析XML_動力節(jié)點Java學(xué)院整理

    Java中JDom解析XML_動力節(jié)點Java學(xué)院整理

    JDOM是一種解析XML的Java工具包。DOM適合于當(dāng)今流行的各種語言,包括Java,JavaScripte,VB,VBScript,Perl,C,C++等。下面通過本文給大家介紹Java中JDom解析XML的方法,感興趣的朋友一起學(xué)習(xí)吧
    2017-07-07
  • 詳解基于MybatisPlus兩步實現(xiàn)多租戶方案

    詳解基于MybatisPlus兩步實現(xiàn)多租戶方案

    這篇文章主要介紹了詳解基于MybatisPlus兩步實現(xiàn)多租戶方案,本文分兩步,通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-04-04
  • Java注解處理器簡單實例

    Java注解處理器簡單實例

    這篇文章主要介紹了Java注解處理器簡單實例,具有一定借鑒價值,需要的朋友可以參考下
    2018-01-01
  • Spring注解方式無法掃描Service注解的解決

    Spring注解方式無法掃描Service注解的解決

    這篇文章主要介紹了Spring注解方式無法掃描Service注解的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • SpringBoot集成Druid實現(xiàn)監(jiān)控功能的示例代碼

    SpringBoot集成Druid實現(xiàn)監(jiān)控功能的示例代碼

    這篇文章主要介紹了SpringBoot集成Druid實現(xiàn)監(jiān)控功能,Druid是阿里巴巴開發(fā)的號稱為監(jiān)控而生的數(shù)據(jù)庫連接池,可以很好的監(jiān)控DB池連接和SQL的執(zhí)行情況,天生就是針對監(jiān)控而生的DB連接池,文中通過代碼示例講解非常詳細(xì),需要的朋友可以參考下
    2024-02-02
  • mybatis xml如何使用not in 某個集合的格式

    mybatis xml如何使用not in 某個集合的格式

    這篇文章主要介紹了mybatis xml如何使用not in 某個集合的格式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • Java?Spring?AOP源碼解析之事務(wù)實現(xiàn)原理

    Java?Spring?AOP源碼解析之事務(wù)實現(xiàn)原理

    這篇文章主要為大家介紹了Java?Spring?AOP事務(wù)實現(xiàn)原理,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01
  • Java設(shè)計模式之狀態(tài)模式詳解

    Java設(shè)計模式之狀態(tài)模式詳解

    Java?中的狀態(tài)模式(State?Pattern)是一種行為型設(shè)計模式,它允許對象在內(nèi)部狀態(tài)發(fā)生改變時改變其行為,本文將詳細(xì)介紹?Java?中的狀態(tài)模式,我們將從狀態(tài)模式的概述、結(jié)構(gòu)與實現(xiàn)、優(yōu)缺點、適用場景等方面進(jìn)行講解,需要的朋友可以參考下
    2023-05-05
  • Java同步關(guān)鍵字synchronize底層實現(xiàn)原理解析

    Java同步關(guān)鍵字synchronize底層實現(xiàn)原理解析

    synchronized關(guān)鍵字對大家來說并不陌生,當(dāng)我們遇到并發(fā)情況時,優(yōu)先會想到用synchronized關(guān)鍵字去解決,synchronized確實能夠幫助我們?nèi)ソ鉀Q并發(fā)的問題,接下來通過本文給大家分享java synchronize底層實現(xiàn)原理,感興趣的朋友一起看看吧
    2021-08-08

最新評論

都匀市| 五华县| 祁东县| 娄底市| 常熟市| 东明县| 岐山县| 三穗县| 阳新县| 江津市| 那坡县| 岱山县| 永清县| 广南县| 高密市| 静海县| 景东| 名山县| 阳谷县| 分宜县| 上虞市| 扶风县| 桐城市| 曲麻莱县| 林芝县| 南靖县| 庆阳市| 清远市| 鄢陵县| 白城市| 临武县| 樟树市| 南川市| 渭南市| 湾仔区| 新丰县| 侯马市| 无棣县| 汉川市| 玉树县| 栾川县|