AES128密钥生成

本文介绍了AESUtil类,它提供了AES加密和解密功能,使用CBC/PKCS5Padding模式,配合Base64编码,以及在用户登录和注册场景中的应用实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

AESUtil(加密、解密)

import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;


import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
/**
* @author Anna
* @date 2023/6/15
*/


public class AesUtil {

    private static String salt="你的16位salt(自己定义)";
    
    /**
     * 加密
     * content 需要加密的内容
     * key 加密秘钥
     * return 返回加密后的内容
     */
    public static  String Encrypt(String content) throws Exception {

        byte[] raw = salt.getBytes("utf-8");
        SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES"); //设置密钥规范为AES
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");//"算法/模式/补码方式"
        //CBC模式需要配置偏移量,设置一个向量,达到密码唯一性,增加加密算法的强度
        IvParameterSpec iv = new IvParameterSpec("1234567890123456".getBytes());
        cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);
        byte[] encrypted = cipher.doFinal(content.getBytes());

        return new BASE64Encoder().encode(encrypted);//此处使用BASE64做转码功能
    }




    /**
     * 解密方法
     * content 需要解密的密文
     * key 解密的秘钥
     * return 解密后的内容
     */
    public static String Decrypt(String content, String key) throws Exception {
        try {
            // 判断Key是否正确
            if (key == null) {
                System.out.print("Key为空null");
                return null;
            }
            // 判断Key是否为16位
            if (key.length() != 16) {
                System.out.print("Key长度不是16位");
                return null;
            }
            byte[] raw = key.getBytes("ASCII"); //参数类型
            SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");  //"算法/模式/补码方式"
            //CBC模式需要配置偏移量,设置这个后,不会出来同一个明文加密为同一个密文的问题,达到密文唯一性
            IvParameterSpec iv = new IvParameterSpec("1234567890123456".getBytes());
            cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv);
            byte[] encrypted1 = new BASE64Decoder().decodeBuffer(content);//先用base64解密
            try {
                byte[] original = cipher.doFinal(encrypted1);
                String originalString = new String(original);
                return originalString;
            } catch (Exception e) {
                System.out.println(e);
                return null;
            }
        } catch (Exception ex) {
            System.out.println(ex);
            return null;
        }
    }
}

如何使用:


public User login(User user) {
    // 根据用户名查询
    String userName = user.getUserName();
    QueryWrapper<User> userQueryWrapper = new QueryWrapper<>();
    userQueryWrapper.eq("user_name", userName);
    User data = getOne(userQueryWrapper);
    if (data == null) {
        throw new CustomException(ErrCodeEnum.USER_ACCOUNT_ERROR);
    }
    // 比较密码
    try {
        String userPwd = AesUtil.Decrypt(data.getUserPwd(), data.getUserSalt());
        if (!StrUtil.equals(userPwd, user.getUserPwd())) {
            throw new CustomException(ErrCodeEnum.USER_PASSWORD_ERROR.getErrDescription());
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    return data;
}


public String saveNewUser(User user) {
    try {
        String pwd=AesUtil.Encrypt(user.getUserPwd());
        user.setUserPwd(pwd);
        boolean save = save(user);
        if (!save) {
            throw new CustomException(ErrCodeEnum.USER_SAVE_ERROR);
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    return "test";
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值