简述aes算法的加密过程:AES加密算法 热部署实战总结
简述aes算法的加密过程:AES加密算法 热部署实战总结
1 AES加密算法在项目中的运用总结1.1 背景由于老系统框架较旧,新的模块采用springboot开发。 但是页面得挂载在老系统上。老系统页面利用iframe挂载子系统。
子系统的用户信息来源于老系统登录的用户。
老系统与子系统如何进行数据传输,如何保证数据安全,这个是个关键。
1.2 思路- 先定义好老盐、密码
- 之后通过用户id取值 盐 字符串组成16位新盐
- 之后新盐 明文 加密生成token
- 子系统获取token,利用老盐解密,生成明文,明文与之前的明文相等则校验成功
publicclassAESUtil{
privatestaticfinalStringKEY_ALGORITHM="AES";
privatestaticfinalStringDEFAULT_CIPHER_ALGORITHM="AES/CBC/PKCS5Padding";//默认的加密算法
/**
*加密
*最终的salt必须为16位
*@paramdata待加密数据
*@paramsalt
*@return
*@throwsException
*/
publicstaticStringencryptAES(Stringdata Stringsalt)throwsException{
byte[]key=salt.getBytes("UTF-8");
Ciphercipher=getCipher(Cipher.ENCRYPT_MODE key key);
byte[]decryptData=data.getBytes();
byte[]decrypt=cipher.doFinal(decryptData);
returnnewBASE64Encoder().encode(decrypt);//y引入appache
}
publicstaticCiphergetCipher(intmode byte[]key byte[]iv)throwsException{
Ciphercipher=Cipher.getInstance(DEFAULT_CIPHER_ALGORITHM);
SecretKeySpecsecretKeySpec=newSecretKeySpec(key KEY_ALGORITHM);
cipher.init(mode secretKeySpec newIvParameterSpec(iv));
returncipher;
}
/**
*解密
*@paramdata加密数据
*@paramoriginal原始待加密数据
*@paramsalt
*@return
*@throwsException
*/
publicstaticStringdecryptAES(Stringdata Stringoriginal Stringsalt)throwsException{
byte[]key=salt.getBytes("UTF-8");
Ciphercipher=getCipher(Cipher.DECRYPT_MODE key key);
//执行操作
byte[]result=cipher.doFinal(newBASE64Decoder().decodeBuffer(data));
returnnewString(result "UTF-8");
}
}
1.4 代码分享-DecryptAESUtil加密类
@SuppressWarnings("restriction")
publicclassDecryptAESUtil{
privatestaticCiphergetCipher(byte[]key byte[]iv)throwsException{
Ciphercipher=Cipher.getInstance("AES/CBC/PKCS5Padding");
SecretKeySpecsecretKeySpec=newSecretKeySpec(key "AES");
cipher.init(Cipher.DECRYPT_MODE secretKeySpec newIvParameterSpec(iv));
returncipher;
}
/**
*解密
*
*@paramdata加密数据
*@paramoriginal原始待加密数据
*@paramsalt盐
*@return{String}
*/
publicstaticStringdecryptAES(Stringdata Stringoriginal Stringsalt){
try{
while(original.length()<6){
original ="0";
}
intlen=original.length();
//组成16位盐
salt=original.substring(len-6 len-4) "^@$$@^" salt;
byte[]key=salt.getBytes(StandardCharsets.UTF_8);
Ciphercipher=getCipher(key key);
//执行操作
byte[]result=cipher.doFinal(newBASE64Decoder().decodeBuffer(data));
String[]str=newString(result StandardCharsets.UTF_8).split("@");
//如果userId小于6,则判断尾数是不是0,是0就去掉
if(!original.equals(str[0])){
return"";
}
returnstr[1];
}catch(Exceptione){
thrownewRuntimeException(e.toString());
}
}
}
1.4 代码分享-简单测试
@Test
publicvoidtest13()throwsException{
Stringsalt="sddm-sai";
Stringsalt1="sddm-sai";
Stringpassword="startdm-settlement-invoice";
Stringuserid="USR20160309141711599155721";
intlen=userid.length();
if(len<6){
inti=6-len;
while(i>0){
userid ="0";
i--;
}
len=6;
}
Stringsubstring=userid.substring(len-6 len-4);
//组成16位盐身份证2位 字符串6位 salt8位
salt=substring "^@$$@^" salt;
//加密用户id "@" 密码,盐
Stringtoken=AESUtil.encryptAES(userid "@" password salt);
System.out.println("加密后:" token);
System.out.println("解密====");
Strings=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 开启自动编译