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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,042评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 89,996评论 2 384
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,674评论 0 345
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,340评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,404评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,749评论 1 289
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,902评论 3 405
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,662评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,110评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,451评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,577评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,258评论 4 328
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,848评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,726评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,952评论 1 264
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,271评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,452评论 2 348

推荐阅读更多精彩内容

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