网站首页 > 技术文章 正文
1 AES加密算法在项目中的运用总结
1.1 背景
由于老系统框架较旧,新的模块采用springboot开发。 但是页面得挂载在老系统上。老系统页面利用iframe挂载子系统。
子系统的用户信息来源于老系统登录的用户。
老系统与子系统如何进行数据传输,如何保证数据安全,这个是个关键。
1.2 思路
- 先定义好老盐、密码
- 之后通过用户id取值+盐+字符串组成16位新盐
- 之后新盐+明文 加密生成token
- 子系统获取token,利用老盐解密,生成明文,明文与之前的明文相等则校验成功
1.3 代码分享-AESUtil加密类
public class AESUtil {
private static final String KEY_ALGORITHM = "AES";
private static final String DEFAULT_CIPHER_ALGORITHM = "AES/CBC/PKCS5Padding";//默认的加密算法
/**
* 加密
* 最终的salt必须为16位
* @param data 待加密数据
* @param salt
* @return
* @throws Exception
*/
public static String encryptAES(String data, String salt) throws Exception {
byte[] key = salt.getBytes("UTF-8");
Cipher cipher = getCipher(Cipher.ENCRYPT_MODE, key, key);
byte[] decryptData = data.getBytes();
byte[] decrypt = cipher.doFinal(decryptData);
return new BASE64Encoder().encode(decrypt);//y引入appache
}
public static Cipher getCipher(int mode, byte[] key, byte[] iv) throws Exception{
Cipher cipher = Cipher.getInstance(DEFAULT_CIPHER_ALGORITHM);
SecretKeySpec secretKeySpec = new SecretKeySpec(key, KEY_ALGORITHM);
cipher.init(mode, secretKeySpec, new IvParameterSpec(iv));
return cipher;
}
/**
* 解密
* @param data 加密数据
* @param original 原始待加密数据
* @param salt
* @return
* @throws Exception
*/
public static String decryptAES(String data, String original, String salt) throws Exception {
byte[] key = salt.getBytes("UTF-8");
Cipher cipher = getCipher(Cipher.DECRYPT_MODE, key, key);
//执行操作
byte[] result = cipher.doFinal(new BASE64Decoder().decodeBuffer(data));
return new String(result, "UTF-8");
}
}
1.4 代码分享-DecryptAESUtil加密类
@SuppressWarnings("restriction")
public class DecryptAESUtil {
private static Cipher getCipher(byte[] key, byte[] iv) throws Exception {
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
SecretKeySpec secretKeySpec = new SecretKeySpec(key, "AES");
cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, new IvParameterSpec(iv));
return cipher;
}
/**
* 解密
*
* @param data 加密数据
* @param original 原始待加密数据
* @param salt 盐
* @return {String}
*/
public static String decryptAES(String data, String original, String salt) {
try {
while (original.length() < 6) {
original += "0";
}
int len = original.length();
//组成16位盐
salt = original.substring(len - 6, len - 4) + "^@$@^" + salt;
byte[] key = salt.getBytes(StandardCharsets.UTF_8);
Cipher cipher = getCipher(key, key);
//执行操作
byte[] result = cipher.doFinal(new BASE64Decoder().decodeBuffer(data));
String[] str = new String(result, StandardCharsets.UTF_8).split("@");
// 如果userId 小于6, 则判断尾数是不是0 , 是0 就去掉
if (!original.equals(str[0])) {
return "";
}
return str[1];
} catch (Exception e) {
throw new RuntimeException(e.toString());
}
}
}
1.4 代码分享-简单测试
@Test
public void test13() throws Exception {
String salt = "sddm-sai";
String salt1 = "sddm-sai";
String password = "startdm-settlement-invoice";
String userid = "USR20160309141711599155721";
int len = userid.length();
if(len < 6){
int i = 6 - len;
while(i > 0){
userid += "0";
i--;
}
len = 6;
}
String substring = userid.substring(len - 6, len - 4);
//组成16位盐 身份证2位 + 字符串6位 + salt8位
salt = substring + "^@$@^" +salt;
//加密 用户id+"@"+密码 , 盐
String token = AESUtil.encryptAES(userid + "@" + password, salt);
System.out.println("加密后:"+ token);
System.out.println("解密====");
String s = DecryptAESUtil.decryptAES(token, userid, salt1);
System.out.println("解密后:"+ s);
加密前userid@password : USR20160309141711599155721@startdm-settlement-invoice
加密后:VdEq0I05B3FpfDkEtVvbakrLHbZELgOUnwouUd0wl2TdIai1KxhEGtgsMhHdnIEjI2K5Sp+ds2pF
Xo3RbatdmQ==
解密中ing
解密后输出password:startdm-settlement-invoice
2 热部署在项目中的运用总结
2.1 引入pom
<!--热部署-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
2.2 配置文件
spring.devtools.restart.enabled=true
spring.devtools.restart.additional-paths= src/main/java
spring.devtools.exclude=WEB-INF/**
spring.freemarker.cache=false
2.3 开启自动编译
2.4 ctrl+shift+alt+/ 选择registry
2.5 设置项目启动加载方式
猜你喜欢
- 2025-05-24 网络信息安全之敏感信息在传输、显示时如何加密和脱敏处理
- 2025-05-24 常见加密方式及Python实现
- 2025-05-24 pdf怎么加密
- 2025-05-24 aes256 加密 解密 (python3) 「二」
- 2025-05-24 深入理解Python3密码学:详解PyCrypto库加密、解密与数字签名
- 2025-05-24 Springboot实现对配置文件中的明文密码加密
- 2025-05-24 JavaScript常规加密技术
- 2025-05-24 信息安全人人平等 谷歌推出低性能安卓手机加密技术
- 2025-05-24 SpringBoot与Jasypt整合,实现数据库字段自动加密解密功能
- 2025-05-24 安全性能爆表!Win10 TH2引入XTS-AES加密算法
你 发表评论:
欢迎- 07-10Oracle 与 Google Cloud 携手大幅扩展多云服务
- 07-10分享收藏的 oracle 11.2.0.4各平台的下载地址
- 07-10Oracle 和 Microsoft 推出 Oracle Exadata 数据库服务
- 07-10Oracle Database@Azure 推进到南美等新区域并增加了新服务
- 07-10Oracle宣布推出 Oracle Database@AWS 的有限预览版
- 07-10Oracle与Nextcloud合作,推出主权云上的安全协作平台
- 07-10NodeRED魔改版连接MsSql、PostgreSQL、MySQL、OracleDB存储无忧
- 07-10对于企业数据云备份,“多备份”承诺的是成本更低,管理更高效#36氪开放日深圳站#
- 601℃几个Oracle空值处理函数 oracle处理null值的函数
- 593℃Oracle分析函数之Lag和Lead()使用
- 581℃0497-如何将Kerberos的CDH6.1从Oracle JDK 1.8迁移至OpenJDK 1.8
- 578℃Oracle数据库的单、多行函数 oracle执行多个sql语句
- 573℃Oracle 12c PDB迁移(一) oracle迁移到oceanbase
- 566℃【数据统计分析】详解Oracle分组函数之CUBE
- 552℃最佳实践 | 提效 47 倍,制造业生产 Oracle 迁移替换
- 547℃Oracle有哪些常见的函数? oracle中常用的函数
- 最近发表
-
- Oracle 与 Google Cloud 携手大幅扩展多云服务
- 分享收藏的 oracle 11.2.0.4各平台的下载地址
- Oracle 和 Microsoft 推出 Oracle Exadata 数据库服务
- Oracle Database@Azure 推进到南美等新区域并增加了新服务
- Oracle宣布推出 Oracle Database@AWS 的有限预览版
- Oracle与Nextcloud合作,推出主权云上的安全协作平台
- NodeRED魔改版连接MsSql、PostgreSQL、MySQL、OracleDB存储无忧
- 对于企业数据云备份,“多备份”承诺的是成本更低,管理更高效#36氪开放日深圳站#
- 解读丨《归档文件整理规则》— 电子文件元数据存储
- Data Guard跳归档恢复的实践(dataguard failover)
- 标签列表
-
- 前端设计模式 (75)
- 前端性能优化 (51)
- 前端模板 (66)
- 前端跨域 (52)
- 前端缓存 (63)
- 前端aes加密 (58)
- 前端脚手架 (56)
- 前端md5加密 (54)
- 前端路由 (61)
- 前端数组 (73)
- 前端js面试题 (50)
- 前端定时器 (59)
- 前端获取当前时间 (50)
- Oracle RAC (76)
- oracle恢复 (77)
- oracle 删除表 (52)
- oracle 用户名 (80)
- oracle 工具 (55)
- oracle 内存 (55)
- oracle 导出表 (62)
- oracle约束 (54)
- oracle 中文 (51)
- oracle链接 (54)
- oracle的函数 (57)
- 前端调试 (52)
本文暂时没有评论,来添加一个吧(●'◡'●)