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算法進(jìn)行轉(zhuǎn)碼,避免出現(xiàn)中文亂碼*/
            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算法進(jìn)行轉(zhuǎn)碼,避免出現(xiàn)中文亂碼*/
            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類,用于提供統(tǒng)一對(duì)外加解密功能

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;
    }
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1.List<T>和List<?>的區(qū)別? List<T>是泛型,List<?>是泛型類型通配符,相當(dāng)于List<...
    小酷哥閱讀 976評(píng)論 0 2
  • 世間總是存在缺憾。如果所有有情人能夠終成眷屬,所有美好的期待和愿望能夠?qū)崿F(xiàn),所有好人能夠終有好報(bào)......可...
    風(fēng)竹禪玉閱讀 507評(píng)論 1 1
  • 這幾天心情不好,所有的事情都不順,似乎壞運(yùn)氣爆棚,幾乎要崩潰的感覺。什么也沒有心思做,眼前一片暗淡找不到活著的希望...
    泠泠_6b44閱讀 537評(píng)論 6 6
  • 首先是本次周檢視會(huì)是一次脫稿分享,每位組員都分享了走進(jìn)易效能取得的成績(jī),以及這一個(gè)月來(lái)新的收獲,我對(duì)主持人和每位分...
    老焦的一天閱讀 299評(píng)論 0 1
  • 前段時(shí)間在與網(wǎng)友聊到關(guān)于制約人們生命和觀念的東西時(shí),本人用到了兩組詞語(yǔ)——基因和模因?;蜃圆槐卣f,關(guān)于模因...
    碌不平閱讀 1,263評(píng)論 0 0

友情鏈接更多精彩內(nèi)容