签名/加密_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);            //转换为字符串返回
    }