公共方法
- 加密工具类:提供数据加密和解密的方法,例如MD5加密、AES加密、Base64编码等。
- 验证工具类:提供数据验证和校验的方法,例如验证手机号码格式、邮箱格式、密码强度等。
- 文件操作工具类:提供文件上传、下载、读写等操作的方法,例如文件上传到服务器、读取文件内容、下载文件等。
- 时间日期工具类:提供时间日期格式化、解析和计算的方法,例如日期转换为字符串、字符串转换为日期、计算两个日期之间的差值等。
- 字符串处理工具类:提供字符串处理的方法,例如字符串判空、去除字符串的空格、拼接字符串等。
- 数字处理工具类:提供数字的格式化、计算和转换的方法,例如字符串转数字、保留指定小数位数、数字格式化为货币等。
- 参数校验工具类:提供常见参数校验的方法,例如检查参数是否为空、是否为正整数、是否在指定范围等。
- HTTP请求工具类:封装常见的HTTP请求方法,例如发送GET请求、POST请求、设置请求头、处理响应结果等。
- 缓存操作工具类:提供缓存读写和操作的方法,例如读取缓存、写入缓存、删除缓存等。
- 日志工具类:封装日志记录的方法,例如记录日志、设置日志级别、输出日志到控制台或文件等。
1.加密工具类
在JavaWeb开发中,我们经常需要处理用户敏感数据的加密,比如密码、令牌等。加密工具类可以提供各种加密算法的封装,如MD5加密、SHA加密、AES加密等。
MD5加密
1.特点
-
1.长度固定:
不管多长的字符串,加密后长度都是一样长
作用:方便平时信息的统计和管理 -
2.易计算:
字符串和文件加密的过程是容易的.
作用: 开发者很容易理解和做出加密工具 -
3.细微性
一个文件,不管多大,小到几k,大到几G,你只要改变里面某个字符,那么都会导致MD5值改变.
作用:很多软件和应用在网站提供下载资源,其中包含了对文件的MD5码,用户下载后只需要用工具测一下下载好的文件,通过对比就知道该文件是否有过更改变动. -
4.不可逆性
你明明知道密文和加密方式,你却无法反向计算出原密码.
**作用:**基于这个特点,很多安全的加密方式都是用到.大大提高了数据的安全性2.后续讲解
-
关于撞库破解:
这是概率极低的破解方法,原理就是:
1.建立一个大型的数据库,把日常的各个语句,通过MD5加密成为密文,不断的积累大量的句子,放在一个庞大的数据库里.
2.比如一个人拿到了别人的密文,想去查询真实的密码,就需要那这个密文去到提供这个数据库的公司网站去查询.
3.关于MD5加盐:
比如我的银行密码是”12345”
1.得到的MD5是:827ccb0eea8a706c4c34a16891f84e7b
2.一个人截取到这个密文,那么通过撞库肯定容易撞出12345.
3.我们要做的就是加盐,银行密码还是”12345”,然后我把银行密码加上我特定的字符串才计算MD5
所以密码还是那个密码,但是变成求”12345密码加密987”的MD5值,然后再得到MD5,那么这个MD5起码可以确认那个数据库不会有. -
举例:
1.对test表中password加密
(效果展示)
(md5加密代码)
public class EncryptionUtils {
public static String md5(String dateString) throws Exception {
MessageDigest md5 = null;
byte[] digest = MessageDigest.getInstance("md5").digest(dateString.getBytes("utf-8"));
String md5code = new BigInteger(1, digest).toString(16);
// 如果生成数字未满32位,需要前面补0
for (int i = 0; i < 32 - md5code.length(); i++) {
md5code = "0" + md5code;
}
return md5code;
}
}
(Service层调用)
public String Register( Test test) throws Exception {
LambdaQueryWrapper<Test> queryWrapper = new LambdaQueryWrapper();
queryWrapper.eq(Test::getUsername,test.getUsername());
Test registerTest = testService.getOne(queryWrapper);
if(registerTest!=null){
return "用户名已存在";
}
else{
if(VerifyUtils.Phone(test.getPhoneNumber())==true&&VerifyUtils.Email(test.getEmail())==true){
test.setPassword(EncryptionUtils.md5(test.getPassword()));
testMapper.insert(test);
return "注册成功";
}
else if (VerifyUtils.Phone(test.getPhoneNumber())==false){
return "手机号格式错误";
}
else if (VerifyUtils.Email(test.getEmail())==false){
return "邮箱格式错误";
}
else {
return "注册失败";
}
}
}
Jasypt介绍
什么是Jasypt?
Jasypt 是一个 java 库,可以使开发者不需要太多操作来给 Java 项目添加基本加密功能,而且不需要知道加密原理。Jasypt 为开发人员提供了一种简单易用加密功能,包括:密码认证、字符串加密等。
Jasypt 有哪些特点?
- 高安全性、基于标准的加密技术,适用于单向和双向加密。加密密码、文本、数字、二进制文件
- 适合集成到基于 Spring 的应用程序中
- 用于加密应用程序(即数据源)配置的集成功能
哪些信息要加密呢?
一般来说,项目配置文件里,所有涉及信息安全的配置项(或字段)都应该做处理,典型的比如:
- 数据库密码,如mysql
- 第三方缓存中间件的密码,如 redis、mongodb
- 其他中间件,如消息中间件、zk、nacos等
- 各种第三方服务的 Access_Key
使用jasypt对配置加密
(添加依赖)
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
<version>2.1.0</version>
</dependency>
(设置密钥)
jasypt.encryptor.password=密钥
(加密函数)
public void getPass() {
String url = encryptor.encrypt("数据库地址");
String name = encryptor.encrypt("用户名");
String password = encryptor.encrypt("密码");
System.out.println("database url: " + url);
System.out.println("database name: " + name);
System.out.println("database password: " + password);
Assert.assertTrue(url.length() > 0);
Assert.assertTrue(name.length() > 0);
Assert.assertTrue(password.length() > 0);
}
(加密处理结果)
(修改配置文件)
spring.datasource.url=ENC(+96/a0hWaQ4lCdzzy3lfhk8l9icTyrZO2NnXw37V9dc22pkgbE7JnJHlQWVh28Jj6P+Rc0A/vITxcA40VCxfNg==)
spring.datasource.username=ENC(0M9MeFl8RHUXT8OdfebbtQ==)
spring.datasource.password=ENC(gLsxCuO75KU3cbojbDQT7g==)
jasypt.encryptor.password=密钥
2.验证工具类
举例:
验证邮箱和手机号码格式
(验证代码)
public class VerifyUtils {
public static boolean Phone(String phoneNumber){
boolean flag = false;
try{
String check = "^1[3-9]\\d{9}$";
Pattern regex = Pattern.compile(check);
Matcher matcher = regex.matcher(phoneNumber);
flag = matcher.matches();
}catch(Exception e){
flag = false;
}
return flag;
}
public static boolean Email(String email){
boolean flag = false;
try{
String check = "[a-zA-Z0-9]+@[a-zA-Z0-9]+\\.[a-zA-Z0-9]+";
Pattern regex = Pattern.compile(check);
Matcher matcher = regex.matcher(email);
flag = matcher.matches();
}catch(Exception e){
flag = false;
}
return flag;
}
}
(Service层调用)
public String Register( Test test) throws Exception {
LambdaQueryWrapper<Test> queryWrapper = new LambdaQueryWrapper();
queryWrapper.eq(Test::getUsername,test.getUsername());
Test registerTest = testService.getOne(queryWrapper);
if(registerTest!=null){
return "用户名已存在";
}
else{
if(VerifyUtils.Phone(test.getPhoneNumber())==true&&VerifyUtils.Email(test.getEmail())==true){
test.setPassword(EncryptionUtils.md5(test.getPassword()));
testMapper.insert(test);
return "注册成功";
}
else if (VerifyUtils.Phone(test.getPhoneNumber())==false){
return "手机号格式错误";
}
else if (VerifyUtils.Email(test.getEmail())==false){
return "邮箱格式错误";
}
else {
return "注册失败";
}
}
}
))==false){
return “手机号格式错误”;
}
else if (VerifyUtils.Email(test.getEmail())==false){
return “邮箱格式错误”;
}
else {
return “注册失败”;
}
}
}