java : AES、MD5等加解密

1、新建EncryptEnums枚举,用于定义组件提供的加解密种类

package com.hua.common.tools.encrypt;

import lombok.Getter;

/**
 * @Deacription TODO
 * @Author huazi
 * @Date 2020/4/4 13:03
 **/
@Getter
public enum EncryptEnums {

    AES("AES"),
    MD5("MD5"),
    ;
    private String type;

    EncryptEnums(String type) {
        this.type = type;
    }
}

2、新建EncryptException类,用于自定义异常类

package com.hua.common.tools.encrypt;

/**
 * @Deacription TODO
 * @Author huazi
 * @Date 2020/4/4 13:05
 **/
public class EncryptException extends RuntimeException {

    private String code;

    private String message;

    public EncryptException(String message) {
        super(message);
    }

    public EncryptException(String code, String message) {
        super(message);
        this.code = code;
        this.message = message;
    }

    public EncryptException(String message, Throwable cause) {
        super(message, cause);
    }
}

3、新建EncryptFactory ,用于初始化具体加解密组件

package com.hua.common.tools.encrypt;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * @Deacription TODO
 * @Author huazi
 * @Date 2020/4/4 13:40
 **/
public final class EncryptFactory {

    protected static Map<String, EncryptService> ENCRYPT_SERVICE = new ConcurrentHashMap<>();

    static {
        ENCRYPT_SERVICE.put(EncryptEnums.AES.getType(), new AesEncryptService());
    }
}

4、新建EncryptService,用于定义加解密接口

package com.hua.common.tools.encrypt;

/**
 * @Deacription TODO
 * @Author huazi
 * @Date 2020/4/4 12:53
 **/
public interface EncryptService {

    /**
     * @Description:
     * @Param: [planText  明文, secretKey 秘钥]
     * @Author: hongjianhua
     * @Date: 2020/4/4 12:57
     */
    String encode(String planText, String secretKey);

    /**
     * @Description: 解密
     * @Param: [secretText 密文,secretKey  秘钥]
     * @Author: hongjianhua
     * @Date: 2020/4/4 12:55
     */
    String decode(String secretText, String secretKey);
}

5、新建AbstractEncrypt,用于提供加解密公共方法

package com.hua.common.tools.encrypt;

import org.apache.commons.lang3.StringUtils;

/**
 * @Deacription TODO
 * @Author huazi
 * @Date 2020/4/4 12:58
 **/
public abstract class AbstractEncrypt implements EncryptService {

    protected final void encodeValid(String planText, String secretKey) {
        if (StringUtils.isBlank(planText)) {
            throw new EncryptException("encode planText is null");
        }
        if (StringUtils.isBlank(secretKey)) {
            throw new EncryptException("encode secretKey is null");
        }
    }
}

6、新建AesEncryptService,用于AES加解密

package com.hua.common.tools.encrypt;

import org.apache.commons.codec.binary.Base64;

import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;

/**
 * @Deacription TODO
 * @Author huazi
 * @Date 2020/4/4 12:52
 **/
public class AesEncryptService extends AbstractEncrypt {

    private static final String ALGORITHMSTR = "AES";

    private static final String DEFAULT_CHARSET = "utf-8";

    private static final int SIZE = 128;

    private static final int KEY_LENGTH = 16;

    @Override
    public String encode(String planText, String secretKey) {
        super.encodeValid(planText, secretKey);
        try {
            Cipher cipher = Cipher.getInstance(ALGORITHMSTR);
            cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(secretKey.getBytes(), ALGORITHMSTR));
            byte[] b = cipher.doFinal(planText.getBytes(DEFAULT_CHARSET));
            /*采用base64算法进行转码,避免出现中文乱码*/
            return Base64.encodeBase64String(b);
        } catch (Exception e) {
            throw new EncryptException("AES encode exception", e);
        }

    }

    @Override
    public String decode(String secretText, String secretKey) {
        try {
            Cipher cipher = Cipher.getInstance(ALGORITHMSTR);
            cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(secretKey.getBytes(), ALGORITHMSTR));
            /*采用base64算法进行转码,避免出现中文乱码*/
            byte[] encryptBytes = Base64.decodeBase64(secretText);
            byte[] decryptBytes = cipher.doFinal(encryptBytes);
            return new String(decryptBytes);
        } catch (Exception e) {
            throw new EncryptException("AES decode exception", e);
        }
    }
}

7、新建EncryptComponent类,用于提供统一对外加解密功能

package com.hua.common.tools.encrypt;

/**
 * @Deacription TODO
 * @Author huazi
 * @Date 2020/4/4 13:43
 **/
public final class EncryptComponent {

    public static String encode(final String planText, final String secretKey, EncryptEnums encryptEnums) {
        EncryptService encryptService = EncryptFactory.ENCRYPT_SERVICE.get(encryptEnums.getType());
        String secretText = encryptService.encode(planText, secretKey);
        return secretText;
    }

    public static String decode(final String secretText, final String secretKey, EncryptEnums encryptEnums) {
        EncryptService encryptService = EncryptFactory.ENCRYPT_SERVICE.get(encryptEnums.getType());
        String planText = encryptService.decode(secretText, secretKey);
        return planText;
    }
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1.List<T>和List<?>的区别? List<T>是泛型,List<?>是泛型类型通配符,相当于List<...
    小酷哥阅读 4,421评论 0 2
  • 世间总是存在缺憾。如果所有有情人能够终成眷属,所有美好的期待和愿望能够实现,所有好人能够终有好报......可...
    风竹禅玉阅读 3,226评论 1 1
  • 这几天心情不好,所有的事情都不顺,似乎坏运气爆棚,几乎要崩溃的感觉。什么也没有心思做,眼前一片暗淡找不到活着的希望...
    泠泠_6b44阅读 3,401评论 6 6
  • 首先是本次周检视会是一次脱稿分享,每位组员都分享了走进易效能取得的成绩,以及这一个月来新的收获,我对主持人和每位分...
    老焦的一天阅读 1,800评论 0 1
  • 前段时间在与网友聊到关于制约人们生命和观念的东西时,本人用到了两组词语——基因和模因。基因自不必说,关于模因...
    碌不平阅读 4,834评论 0 0