springboot源码加密(springboot 接口数据加密)
本文目录一览:
- 1、springboot上传文件到服务器aes加密
- 2、求一套spring boot视频教程
- 3、在Spring中如何使用加密外部属性文件
- 4、怎么能让spring框架加载加密后的.class文件
- 5、springboot feignclient调用服务请求参数加密
- 6、spring boot调用加密狗
springboot上传文件到服务器aes加密
业务需求:数据库中的用户名密码明文存储在配置文件中,不是十分安全。所以将数据库中的用户名密码使用AES对称加密放入配置文件中,达到加密效果。同时也不想使用tomcat等中间件等太繁重,就使用了spring boot 轻量级框架。个人比较菜,轻喷。
关于如何搭建spring boot项目其他的人说的很详细 参考初识Spring Boot框架
入口类代码
@Controller
@SpringBootApplication
@EnableAutoConfiguration
public class Aesdemo1Application {
public static void main(String[] args) {
SpringApplication.run(Aesdemo1Application.class, args);
}
}
运行时只要运行main方法 或者打包后java -jar 即可(写成.bat文件 点击运行方便简单)
@Controller
public class GetKeyController {
@GetMapping("/getkey")
public String greetingForm(Model model) {
model.addAttribute("passwordBean", new PasswordBean()); return "index";
}
@PostMapping("/getkey")
public String greetingSubmit(@ModelAttribute PasswordBean passwordBean) {
String s1 = AESUtil.encrypt(passwordBean.getPassword(), passwordBean.getVar1());
passwordBean.setVar2(s1);
return "result";
}
}
启动后有这里还有一个控制器类
浏览器地址输入 即可跳转到greetingForm 方法,赋入PasswordBean属性后 跳转到index.html
PasswordBean 是自己定义的bean类 里面有password var1 var2 3个属性
index.html代码
!DOCTYPE html
html lang="en" xmlns:th=""
head
meta charset="UTF-8"/
titleTitle/title
/head
body
form action="#" th:action="@{/getkey}" th:object="${passwordBean}" method="post"
p密码: input type="text" th:field="*{password}" //p
p加密字符: input type="text" th:field="*{var1}" //p
pinput type="submit" value="Submit" /
input type="reset" value="Reset" //p
/form
/body
/html
注意使用了thymeleaf框架 所以必须引入
输入要加密的和盐即可获得通过post方法到result即可获得加密后字符串
!DOCTYPE html
html lang="en" xmlns:th=""
head
meta charset="UTF-8"/
titleTitle/title
/head
body
h1Result/h1
p th:text="'密码: ' + ${passwordBean.password}" /
p th:text="'加密字符: ' + ${passwordBean.var1}" /
p th:text="'加密后字符: ' + ${passwordBean.var2}" /
a href="/getkey"Submit another message/a
/body
/html
求一套spring boot视频教程
地址:
视频地址列表:
-------------------------------------------------------------------------
第31节 Spring Boot MyBatis升级篇-注解-分页查询(高清)
第30节 Spring Boot MyBatis升级篇-注解-增删改查(高清)
第29节 Spring Boot MyBatis升级篇-注解-自增ID(高清)
第28节 Spring Boot MyBatis升级篇-注解(高清)
第27节 Spring Boot Servlet(高清)
第26节 Spring Boot 集成Quartz-Job如何自动注入Spring容器托管的对象
第25节 Spring Boot 集成Quartz二次升级版(高清)
第24节 Spring Boot 集成Quartz升级版(高清)
第23节 Spring Boot 集成Quartz普通使用(高清)
第22节 Spring Boot Quartz在Java Project中使用(高清)
第21节 Spring Boot Quartz介绍(高清)
第20节 Spring Boot 定时任务升级篇(集群分布式下的定时任务说明)(高清)
第19节 Spring Boot 定时任务升级篇(动态添加修改删除定时任务)(高清)
第18节 Spring Boot 定时任务升级篇(动态修改cron参数)(高清)
第17节 Spring Boot定时任务
第16节 Spring Boot集成MyBatis
第15节 Spring Boot添加JSP支持
第14节 Spring Boot 使用freemarker
第13节 spring boot使用thymeleaf
第12节配置server信息
第11节 Spring Boot之Hello World访问404
第10节全局异常捕捉
第9节 Spring Boot JdbcTemplate
第8节 Spring Boot Spring Data JPA介绍
第7节 Spring Boot JPA-Hibernate
第6节 Spring Boot JPA/Hibernate/Spring Data概念
第5节 springboot + devtools(热部署)
第4节 Spring Boot热部署(springloader)
第3节 Spring Boot完美使用FastJson解析JSON数据
第2节 spring boot返回json数据
第1节 Spring Boot之Hello World
在Spring中如何使用加密外部属性文件
1.jdbc.properties文件
driverClassName=com.mysql.jdbc.Driver
url:jdbc:mysql://localhost:3306/testdb
username=root
password=123
1
2
3
4
2.xml文件引入属性文件
!-- 引入配置文件 --
bean class="5d89-8fb5-ffbd-1b1f org.springframework.beans.factory.config.PropertyPlaceholderConfiguer"
p:location="class:jdbc.preperties"
p:fileEncoding="utf-8"/
!-- 使用属性值 --
bean id="dataSource" class="8fb5-ffbd-1b1f-b9a1 org.apache.commons.dbcp.BasicDataSource" destroy-method="close"
p:driverClassName="${drverClassName}"
p:url="${url}"
p:username="${userName}"
p:password="${password}"/
1
2
3
4
5
6
7
8
9
10
11
3.PropertyPlaceholderConfigurer其他属性
locations:配置多个配置文件(配置 list 一样)
fileEncoding:编码格式
order:如歌配置多个PropertyPlaceholderConfigurer,通过该属性指定优先顺序
placeholderPrefix:指定占位符前缀,默认为“${”
placeholderSuffix:占位符后缀,默认为“}”
bean id="propertyPlaceholderConfigurer" class="ffbd-1b1f-b9a1-748b org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"
property name="locations"
list
valueclasspath:/opt/demo/config/demo-db.properties/value
valueclasspath:/opt/demo/config/demo-db2.properties/value
/list
/property
/bean
1
2
3
4
5
6
7
8
4.使用””context:property-placeholder””引入属性文件
//这种方式比较优雅,但如果想要配置日他额外高级属性,如属性加密,使用数据库保存配置信息等,必须使用扩展的PropertyPlaceholderConfigurer类并使用bean配置方式
context:property-placeholder location="class:jdbc.properties"/
//引入多个配置文件 逗号分隔
context:property-placeholder
location="classpath:constants.properties ,
classpath:constants_new.properties"
fileEncoding="utf-8"
/
1
2
3
4
5
6
7
8
9
10
11
5.在基于注解的java类配置中引用属性
@Component
public class Test{
//@Value注解可以为Bean注入一个字面量,也可通过@Value("#{proName}")形式注入值
@Value("com.mysql.jdbc.Driver")
private String driverClassName;
@Value("${url}")
private String url;
}
怎么能让spring框架加载加密后的.class文件
加密:使用AES加密,将文件的字节码读取,对字节码进行加密后替换源文件
Java代码
/**
*
* 字节加密
*/
public static byte[] encrypt(byte[] data, String key) throws Exception {
Key k = toKey(Base64.decode(key));
byte[] raw = k.getEncoded();
SecretKeySpec secretKeySpec = new SecretKeySpec(raw, ALGORITHM);
Cipher cipher = Cipher.getInstance(ALGORITHM);
cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);
return cipher.doFinal(data);
}
/**
*
* 字节加密
*/
public static byte[] encrypt(byte[] data, String key) throws Exception {
Key k = toKey(Base64.decode(key));
byte[] raw = k.getEncoded();
SecretKeySpec secretKeySpec = new SecretKeySpec(raw, ALGORITHM);
Cipher cipher = Cipher.getInstance(ALGORITHM);
cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);
return cipher.doFinal(data);
}
解密:
1、在tomcat的WebappClassLoader中修改源码(自动义类加载器);
2、修改spring源码Code包源码。
加密方法
Java代码
public static byte[] decrypt(byte[] data, String key) throws Exception {
Key k = toKey(Base64.decode(key));
byte[] raw = k.getEncoded();
SecretKeySpec secretKeySpec = new SecretKeySpec(raw, ALGORITHM);
Cipher cipher = Cipher.getInstance(ALGORITHM);
cipher.init(Cipher.DECRYPT_MODE, secretKeySpec);
return cipher.doFinal(data);
}
public static byte[] decrypt(byte[] data, String key) throws Exception {
Key k = toKey(Base64.decode(key));
byte[] raw = k.getEncoded();
SecretKeySpec secretKeySpec = new SecretKeySpec(raw, ALGORITHM);
Cipher cipher = Cipher.getInstance(ALGORITHM);
cipher.init(Cipher.DECRYPT_MODE, secretKeySpec);
return cipher.doFinal(data);
}
在 WebappClassLoader中解密
Java代码
/**
* 判断如需是需要解密的类进行数据处理
* */
//--------------------------------------start----------------------------------//
byte []data=null;
try {
if(isDecode(name)){
System.out.println("2818:---"+name);
data=AESUtils.decrypt(entry.binaryContent, key);
}else{
data=entry.binaryContent;
}
} catch (Exception e) {
e.printStackTrace();
}
try {
clazz = defineClass(name, data, 0,
data.length,
new CodeSource(entry.codeBase, entry.certificates));
//--------------------------------------end----------------------------------//
/**
* 判断如需是需要解密的类进行数据处理
* */
//--------------------------------------start----------------------------------//
byte []data=null;
try {
if(isDecode(name)){
System.out.println("2818:---"+name);
data=AESUtils.decrypt(entry.binaryContent, key);
}else{
data=entry.binaryContent;
}
} catch (Exception e) {
e.printStackTrace();
}
try {
clazz = defineClass(name, data, 0,
data.length,
new CodeSource(entry.codeBase, entry.certificates));
//--------------------------------------end----------------------------------//
在spring的code包的SimpleMetadataReader修改器构造函数
Java代码
// TODO 修改源码判断是否需要解密
SimpleMetadataReader(Resource resource, ClassLoader classLoader)
throws IOException {
InputStream is = resource.getInputStream();
ClassReader classReader = null;
try {
String name = "";
if (resource.getURI().toString().indexOf("jar:file") == -1) {
name = resource.getFile().getAbsolutePath();
if (!"".equals(name) isDecode(name, cams)) {
byte[] data = inputStreamToByte(is);
try {
is = new ByteArrayInputStream(AESUtils.decrypt(data,
key));
// is = new ByteArrayInputStream(data);
} catch (Exception e) {
e.printStackTrace();
}
}
}
classReader = new ClassReader(is);
} finally {
is.close();
}
// TODO 修改源码判断是否需要解密
SimpleMetadataReader(Resource resource, ClassLoader classLoader)
throws IOException {
InputStream is = resource.getInputStream();
ClassReader classReader = null;
try {
String name = "";
if (resource.getURI().toString().indexOf("jar:file") == -1) {
name = resource.getFile().getAbsolutePath();
if (!"".equals(name) isDecode(name, cams)) {
byte[] data = inputStreamToByte(is);
try {
is = new ByteArrayInputStream(AESUtils.decrypt(data,
key));
// is = new ByteArrayInputStream(data);
} catch (Exception e) {
e.printStackTrace();
}
}
}
classReader = new ClassReader(is);
} finally {
is.close();
}
在LocalVariableTableParameterNameDiscoverer同样需要进行解密。
注:(此加密有弊端)
1、加密解密算法需保持一致。
2、加密加密密钥需是同一密钥。
springboot feignclient调用服务请求参数加密
spring boot配置(1) 作者同类文章X dependency groupIdorg.springframework...如调用百度的一个api @FeignClient(url = "${baidumap.url}",name
spring boot调用加密狗
java开发加密狗的应用程序,应用于web项目。
springboot项目加密解决方案:配置pomxml用maven直接构建加密后的jar包。使用maven构建jar包;如果springboot项目使用到了JPA并且是用hibernate实现的,那么启动加密后的jar是会报错的,创建服务命令:管理员进入cmd输入 WinSWNET,exe install 即可创建服务;启动服务即可。
"加密锁"(也称加密狗)最早由彩虹天地开发,现已成为软件加密行业的代名词。加密锁是为软件开发商提供的一种智能型的具有软件保护功能的工具,它包含一个安装在计算机并行口或 USB 口上的硬件,及一套适用于各种语言的接口软件和工具软件。加密锁基于硬件保护技术,其目的是通过对软件与数据的保护防止知识产权被非法使用。