首页 > 其他分享 >AES 加密

AES 加密

时间:2023-12-06 12:00:13浏览次数:34  
标签:AES return String cipherText new import public 加密

1.AES 程序加密

  1 package com.demo.util;
  2 
  3 import com.demo.exception.BusinessException;
  4 import com.demo.model.enums.ErrorEnum;
  5 import lombok.extern.slf4j.Slf4j;
  6 import org.apache.commons.lang3.RandomStringUtils;
  7 import org.apache.commons.lang3.StringUtils;
  8 import org.springframework.beans.factory.annotation.Value;
  9 import org.springframework.stereotype.Component;
 10 
 11 import javax.crypto.Cipher;
 12 import javax.crypto.IllegalBlockSizeException;
 13 import javax.crypto.spec.IvParameterSpec;
 14 import javax.crypto.spec.SecretKeySpec;
 15 import java.nio.charset.StandardCharsets;
 16 import java.util.Base64;
 17 
 18 @Component
 19 @Slf4j
 20 public class AesUtil {
 21     private final static String ENCRYPTION_ALGORITHM = "AES/CBC/PKCS5Padding";
 22 
 23     /**
 24      * key
 25      */
 26     public static final String aesKey = "lvzVf_JJ_NjFLWULEWpCfg==";
 27 
 28     /**
 29      * key
 30      */
 31     public static final String aesIv = "ezmhdhlzao32dtus";
 32 
 33     /**
 34      * @return 生成密码需要的盐
 35      */
 36     public static String getSalt() {
 37         return RandomStringUtils.randomAlphabetic(64);
 38     }
 39 
 40     /**
 41      * 对字符串类型的敏感信息,例如手机号,身份证号,银行卡号等进行加密
 42      * 注意尽量将加密数据控制在域内,不同域使用不同的aes key及iv
 43      * 如对同一个加密信息,需要跨服务加解密或匹配,则需要共享key及iv
 44      *
 45      * @param plainText
 46      * @return
 47      * @throws Exception
 48      */
 49     public static String encrypt(String plainText) throws BusinessException {
 50         if (StringUtils.isBlank(plainText)) {
 51             return plainText;
 52         }
 53         try {
 54             Cipher cipher = Cipher.getInstance(ENCRYPTION_ALGORITHM);
 55             byte[] keyBytes = aesKey.getBytes(StandardCharsets.UTF_8);
 56             byte[] iv = aesIv.getBytes(StandardCharsets.UTF_8);
 57             SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "AES");
 58             IvParameterSpec ivSpec = new IvParameterSpec(iv);
 59             cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec);
 60             byte[] cipherText = cipher.doFinal(plainText.getBytes());
 61             return Base64.getUrlEncoder()
 62                     .encodeToString(cipherText);
 63         } catch (Exception ex) {
 64             log.error("加密失败:------" + ex.getMessage());
 65             throw new BusinessException(ErrorEnum.ENCRYPTION_ERROR);
 66         }
 67     }
 68 
 69     /**
 70      * 对字符串类型的敏感信息,例如手机号,身份证号,银行卡号等进行解密
 71      *
 72      * @param cipherText
 73      * @return 考虑对未加密内容的兼容,对出现异常的返回原始值
 74      * @throws Exception
 75      */
 76     public static String decrypt(String cipherText) {
 77         if (StringUtils.isBlank(cipherText)) {
 78             return cipherText;
 79         }
 80         try {
 81             Cipher cipher = Cipher.getInstance(ENCRYPTION_ALGORITHM);
 82             byte[] keyBytes = aesKey.getBytes(StandardCharsets.UTF_8);
 83             byte[] iv = aesIv.getBytes(StandardCharsets.UTF_8);
 84             SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "AES");
 85             IvParameterSpec ivSpec = new IvParameterSpec(iv);
 86             cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec);
 87             byte[] plainText = cipher.doFinal(Base64.getUrlDecoder().decode(cipherText));
 88             return new String(plainText);
 89         } catch (IllegalBlockSizeException | IllegalArgumentException ex) {
 90             return cipherText;
 91         } catch (Exception ex) {
 92             log.error("解密失败:------" + ex.getMessage());
 93             throw new BusinessException(ErrorEnum.DECRYPTION_ERROR);
 94         }
 95     }
 96 
 97     public String getRandom(int length) {
 98         char[] arr = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k',
 99                 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'};
100         String result = String.valueOf(arr[(int) Math.floor(Math.random() * 36)]);
101         for (int i = 1; i < length; i++) {
102             result += arr[(int) Math.floor(Math.random() * 36)];
103         }
104         return result;
105     }
106 
107     /**
108      * 处理查询手机号加密字符串,假如不是手机号则返回原字符串
109      *
110      * @param rawStr
111      * @return
112      */
113     public String getQueryPhone(String rawStr) {
114         return TelephoneUtil.isPhoneNumber(rawStr) ? encrypt(rawStr) : rawStr;
115     }
116 
117     public static void main(String... args) {
118         //key
119         AesUtil securityUtil = new AesUtil();
120 //        System.out.println(securityUtil.getRandom(32));
121         //iv
122         System.out.println(securityUtil.getRandom(16));
123         String param = "1231546";
124         System.out.println("param:" + param);
125         String encrypt = encrypt(param);
126         System.out.println("encrypt:" + encrypt);
127         String decrypt = decrypt(encrypt);
128         System.out.println("decrypt:" + decrypt);
129     }
130 }

 

标签:AES,return,String,cipherText,new,import,public,加密
From: https://www.cnblogs.com/ming-blogs/p/17879201.html

相关文章

  • 什么是全同态加密(FHE)中的自举(Bootstrapping)?
    PrimiHub一款由密码学专家团队打造的开源隐私计算平台,专注于分享数据安全、密码学、联邦学习、同态加密等隐私计算领域的技术和内容。全同态加密(FullyHomomorphicEncryption,FHE)中经常提到的一个术语是“自举”(Bootstrapping)。任何读过FHE初级材料的人都知道,自举是FHE方案中最......
  • 奇迹Mu 删除MD5加密数据库语句!
    很多GM在自己都不知道的情况下,就给游戏加了MD5的加密,MD5加密通常都是32位的加密,在写程序的逻辑上,通常会进行好几次的循环加密,导致很多用户注册或是登陆的时候会显示错误,今天MU-GM给大家提供一个清除数据库MD5的SQL语句。ifexists(select*fromdbo.sysobjectswhereid=obje......
  • AES java加密与MySql加密算法一致
    1.背景数据库加密与java程序加密算法保持一致,统一采用AES加密算法。2.java代码加密1packagecom.pacific.permission.test;23importjavax.crypto.Cipher;4importjavax.crypto.spec.SecretKeySpec;5importjava.util.Base64;67/**8*@authorluzhi......
  • RSA分段加密方案
    1.背景RSA加密对加密的内容是有长度限制的,如果超出了长度限制,就会报错。所以需要采用分段加密,案例如下。2.代码1packagecom.demo.util;23importorg.apache.commons.codec.binary.Base64;4importorg.apache.commons.lang3.ArrayUtils;56importjavax......
  • 详解RSA加密原理
    密码学密码学是指研究信息加密,破解密码的技术科学。密码学的起源可追溯到2000年前。而当今的密码学是以数学为基础的。密码学的历史大致可以追溯到两千年前,相传古罗马名将凯撒大帝为了防止敌方截获情报,用密码传送情报。凯撒的做法很简单,就是对二十几个罗马字母建立一张对应......
  • 关于C#的RSA加密(用于泛微OA)
    由于项目需要,需要用公钥对秘钥进行加密,且对接系统用C#开发,需求是这样的:  注册许可证时返回的公钥spk对秘钥信息secrit进行加密。由于公钥spk是字符串,但C#中只认可的xml字符串的公钥才能够进行加密,可以使用以下方法,先进行转换,将公钥字符串转换成XML,再进行加密,就可以得到加密......
  • 如何实现 token 加密
    以最常见的token格式jwt为例,token分为三段,分别是header、payload、signature。其中,header标识签名算法和令牌类型;payload标识主体信息,包含令牌过期时间、发布时间、发行者、主体内容等;signature是使用特定的算法对前面两部分进行加密,得到的加密结果。token有防篡改的......
  • Apache加密
    配置TLS加密的虚拟主机(443/TLS)SSl提供了3中服务,保证数据的安全传输认证用户和服务器,确保数据发送到正确的客户机和服务器;加密数据以防止数据中途被窃取;维护数据的完整性,确保数据在传输过程中不被改变客户使用https的URL访问Web服务器,要求与Web服务器建立SSL连接。Web服务器......
  • 『坚如磐石的 PieCloudDB』:透明加密模块的设计与实现
    导读:2月17日,由中国开源软件推进联盟PostgreSQL分会&中科院软件所&CSDN联合举办的“中国PostgreSQL数据库生态大会”盛大召开。拓数派(OpenPie)作为冉冉升起的新一代云原生分布式数据库厂商,受邀参加本届大会。 本文为演讲的文字版摘要,主要内容包括: 透明加密的设计思路 透明......
  • AES加密技术:原理与应用
    一、引言随着信息技术的飞速发展,数据安全已成为越来越受到重视的领域。加密技术作为保障数据安全的重要手段,在信息安全领域发挥着举足轻重的作用。AES(AdvancedEncryptionStandard)作为一种对称加密算法,自1990年代以来,已成为加密技术领域的佼佼者,广泛应用于各种信息安全领域。本文......