簽名/加密_Java_hutool( 01 代碼實現 )


 

  本文檔不講解簽名/加密相關的理論知識, 僅列出通過Java實現的方式.

  待處理: Hutool含有很多工具的封裝, 有時間需要好好研究一下(https://blog.csdn.net/moshowgame/article/details/80087954)

 

對稱加密

加解密使用的是同一個秘鑰
基於“對稱密鑰”的加密算法主要有DES、3DES(TripleDES)、AES、RC2、RC4、RC5和Blowfish等。本文只介紹最常用的對稱加密算法DES、3DES(TripleDES)和AES。

 

非對稱加密

加解密使用的是不同的秘鑰
基於“非對稱密鑰”的加密算法主要有RSA、Elgamal、背包算法、Rabin、D-H、ECC(橢圓曲線加密算法)。
使用最廣泛的是RSA算法,Elgamal是另一種常用的非對稱加密算法。

 

使用場景

在互聯網后端技術中非對稱加密技術主要用於登錄、數字簽名、數字證書認證等場景。

 

疑問: 既然堆成加密存在安全問題, 為什么還使用對稱加密呢? ( 我同事告訴我, 當前功能不開放到外網, 使用對稱加密即可 )

 

使用到的依賴包hutool

<!-- https://mvnrepository.com/artifact/cn.hutool/hutool-all -->
<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>4.6.1</version>
</dependency>

 

AES對稱加密/解密

public String encryptAES(String data, String key) throws Exception {
        //生成一個隨機秘鑰
        //byte[] keyRandom = SecureUtil.generateKey(SymmetricAlgorithm.AES.getValue()).getEncoded();
        //將秘鑰轉為Base64
        //String keyRandomEncode = Base64.encode(keyRandom);

        key = "EC/Z+S7c3EFJa2dtvLyekg==";
        
//將Base64編碼的秘鑰的格式進行解碼轉換 byte[] keyByte = Base64.decode(key); //加密 AES aes = SecureUtil.aes(keyByte); //構建 byte[] encryptData = aes.encrypt(data); //加密 //加密后的數據轉為Base64 String encryptDataEncode = Base64.encode(encryptData);
//將Base64編碼加密數據和秘鑰的格式進行解碼轉換 byte[] data2 = Base64.decode(encryptDataEncode); byte[] key2 = Base64.decode(key); //解密 AES aes2 = SecureUtil.aes(key2); byte[] decrypt = aes.decrypt(data2); return "秘鑰: "+ key + ", 加密后的數據: "+ encryptDataEncode + ", 解密后的數據: "+ new String (decrypt); }

 

其他

    @Overridepublic String dataSign(MsgForm msgForm) throws Exception {
        String ywData = msgForm.getData();
        String prikeyYlf = msgForm.getPrivateKey();
        msgForm.getKeyLen();
        Sign sign = new Sign(SignAlgorithm.SHA1withRSA, prikeyYlf, null);
        byte[] encrypt = sign.sign(StrUtil.bytes(ywData, CharsetUtil.CHARSET_UTF_8));
        return Base64.encode(encrypt);
    }
    
    @Overridepublic boolean verifySign(MsgForm msgForm) throws Exception {
        String ywData = msgForm.getData();
        String signData = msgForm.getSignData();
        String publicKey = msgForm.getPublicKey();
        msgForm.getKeyLen();
        Sign sign = new Sign(SignAlgorithm.SHA1withRSA, null, publicKey);
        boolean encrypt = sign.verify(StrUtil.bytes(ywData), Base64.decode(signData));
        //return Base64.encode(encrypt);
        return encrypt;
    }

    
    @Overridepublic String encrypt(MsgForm msgForm) throws Exception {
        RSA rsa = new RSA(null, msgForm.getPublicKey());
        byte[] encrypt = rsa.encrypt(StrUtil.bytes(msgForm.getData(), CharsetUtil.CHARSET_UTF_8), KeyType.PublicKey);
        return Base64.encode(encrypt);
    }

    
    @Overridepublic String decrypt(MsgForm msgForm) throws Exception {
        RSA rsa = new RSA(msgForm.getPrivateKey(), null);
        byte[] decrypt = rsa.decrypt(Base64.decode(msgForm.getData()), KeyType.PrivateKey);
        return Base64.encode(decrypt);
    }
    
    @Overridepublic void dataReceive(MsgForm msgForm) throws Exception {
        SimpleDateFormat ft = new SimpleDateFormat("yyyyMMddHHmmsszzz");
        StringBuffer filePath  = new StringBuffer(Config.getProperty("download.path"));
        filePath.append("99_");
        filePath.append(msgForm.getBusiCode()+"_"); //業務類型(6)
        filePath.append(ft.format(new Date())+"_"); //yyyyMMddhhmisszzz(17)
        filePath.append(new Random().nextInt(10)); //2位隨機數
        filePath.append(new Random().nextInt(10));
        filePath.append(".XML"); //.XML
        //將數據寫入到filePath
        FileWriter fw = new FileWriter(filePath.toString(),"UTF-8");
        byte[] pdfData = Base64.decode(msgForm.getData());
        fw.write(pdfData,0,pdfData.length);
    }
    
    @Overridepublic String encryptAES(String data, String key) throws Exception {
        //生成一個隨機秘鑰
        //byte[] kkkkRandom = SecureUtil.generateKey(SymmetricAlgorithm.AES.getValue()).getEncoded();
        //將秘鑰轉為Base64
        //key = Base64.encode(kkkkRandom);
        //key = "7Df05RgSzVm8/wWzUeTDaA==";
        
        //將Base64編碼的秘鑰的格式進行解碼轉換
        byte[] keyByte = Base64.decode(key);
        //加密
        AES aes = SecureUtil.aes(keyByte);        //構建
        byte[] encryptData = aes.encrypt(data);    //加密
        //加密后的數據轉為Base64
        return Base64.encode(encryptData);
    }
    
    
    @Overridepublic String decryptAES(String data, String key) throws Exception {
        //key = "7Df05RgSzVm8/wWzUeTDaA==";
        //將Base64編碼加密數據和秘鑰的格式進行解碼轉換
        byte[] dataByte = Base64.decode(data);
        byte[] keyByte = Base64.decode(key);
        //解密
        AES aes = SecureUtil.aes(keyByte);        //構建
        byte[] decrypt = aes.decrypt(dataByte);    //加密
        return new String (decrypt);            //轉換為字符串返回
    }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM