阿华代码,不是逆风,就是我疯
你们的点赞收藏是我前进最大的动力!!
希望本文内容能够帮助到你!!
目录
零:项目结果展示
一:音乐播放器Web网页介绍
二:加密算法介绍
1:MD5加密
(1)引入md5算法相关依赖
(2)加盐提高安全性——测试代码
(3)结果
2:BCrypt加密设计
(1)引入依赖
(2)简单理解
(3)测试
3:总结
三:创建配置Config包
四:配置启动类
零:项目结果展示
项目目前已经上线
音乐播放器登录页面铁子们可以后台私信获取管理员用户和密码
一:音乐播放器Web网页介绍
这个网页主要的功能包括:用户登录,上传音乐,播放音乐,收藏音乐到喜欢列表,从喜欢列表中移除音乐,删除指定音乐,批量删除音乐,
二:加密算法介绍
我们的密码保存在数据库当中,如果数据库被黑了,密码被泄露就g了,这里我们就可以对密码进行加密,下面介绍两种加密算法
1:MD5加密
输⼊两个不同的明⽂不会得到相同的输出值
根据输出值,不能得到原始的明⽂——就是过程不可逆,但是现在除了彩虹表,这样的密码也不安全了,有兴趣的老铁可以了解一下。
(1)引入md5算法相关依赖
<!-- md5 依赖 -->
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.9</version>
</dependency>
(2)加盐提高安全性——测试代码
这里边看代码边理解更清晰
核心方法就是DigestUtils.md5Hex(传入字符串)经过某种算法后得到一个新的加密后的字符串
package com.example.musicserver;
import org.apache.commons.codec.digest.DigestUtils;
/**
* Created with IntelliJ IDEA.
* Description:
* User: Hua YY
* Date: 2025-01-15
* Time: 15:01
*/
public class MD5Util {
private static final String salt = "1b2i3t4e";
public static String md5(String src) {
return DigestUtils.md5Hex(src);
}
/**
* 第⼀次加密 :模拟前端⾃⼰加密,然后传到后端
* @param inputPass
* @return
*/
public static String inputPassToFormPass(String inputPass) {
String str = "" + salt.charAt(1) + salt.charAt(3) + inputPass
+ salt.charAt(5) + salt.charAt(6);
return md5(str);
}
/**
* 第2次MD5加密
*
* @param formPass 前端加密过的密码,传给后端进⾏第2次加密
* @param salt ⽤⼾数据库当中的盐值
* @return
*/
public static String formPassToDBPass(String formPass, String salt) {
String str = "" + salt.charAt(0) + salt.charAt(2) + formPass
+ salt.charAt(5)
+ salt.charAt(4);
return md5(str);
}
/**
* 上⾯两个函数合到⼀起进⾏调⽤
*
* @param inputPass
* @param saltDB
* @return
*/
public static String inputPassToDbPass(String inputPass, String saltDB) {
String formPass = inputPassToFormPass(inputPass);
String dbPass = formPassToDBPass(formPass, saltDB);
return dbPass;
}
public static void main(String[] args) {
System.out.println("对⽤⼾输⼊密码进⾏第1次加密:" + inputPassToFormPass("123456"));
System.out.println("对⽤⼾输⼊密码进⾏第2次加密:" + formPassToDBPass(inputPassToFormPass("123456"), "1b2i3t4e"));
System.out.println("对⽤⼾输⼊密码进⾏第2次加密:" + inputPassToDbPass("123456", "1b2i3t4e"));
}
}
(3)结果
不管运行多少次,这里的结果都是相同的
2:BCrypt加密设计
(1)引入依赖
<!-- security依赖包 (加密)-->
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-config</artifactId>
</dependency>
</dependencies>
(2)简单理解
Bcrypt内部⾃⼰实现了随机加盐处理,这样每次得到的密文都是不同的,而且Bcrypt⽣成的密⽂是60位的破解难度更大,但是加密速度慢
(3)测试
public class BCryptTest {
public static void main(String[] args) {
//模拟从前端获得的密码
String password = "123456";
BCryptPasswordEncoder bCryptPasswordEncoder = new BCryptPasswordEncoder();//编码器
String newPassword = bCryptPasswordEncoder.encode(password);
System.out.println("加密的密码为: " + newPassword);
//使⽤matches⽅法进⾏密码的校验
boolean same_password_result = bCryptPasswordEncoder.matches(password, newPassword);
//返回true
System.out.println("加密的密码和正确密码对⽐结果: " + same_password_result);
boolean other_password_result = bCryptPasswordEncoder.matches("987654", newPassword);
//返回false
System.out.println("加密的密码和错误的密码对⽐结果: " + other_password_result);
}
}
3:总结
对比:MD5加密,每次加密的盐值是相同的,所以每次得到的密文都是相同的。
Bcrypt相反,内部已经实现了随机盐值,所以每次得到的密文都是不同的。
MD5加密后的密文是32位,加密速度快,但破解起来更容易
Bcrypt加密后的密文是60位的,加密速度更慢,破解难度更大
三:创建配置Config包
新建AppConfig类,给BCryptPasswordEncoder实例化封装一层方法
我们把明文:123456加密后的密文存储在数据库当中。
@Configuration
public class AppConfig {
@Bean
public BCryptPasswordEncoder getBCryptPasswordEncoder() {
return new BCryptPasswordEncoder();
}
}
四:配置启动类
当启动类,没有加这个过滤的时候,我们发现不能进⾏登录,这是因为在SpringBoot中,默认的Spring Security⽣效了的,此时的接⼝都是被保护的。
此时我们做一些特定的操作可能会被拦截,比如说我们在开发或者测试期间使用某些算法加密,这里我们使用了Scrypt加密嘛,所以就被拦截了
此时通过下述exclude配置,即可禁⽤默认的登录验证。
@SpringBootApplication(exclude =
{org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class})
//@SpringBootApplication
public class MusicserverApplication {
public static void main(String[] args) {
SpringApplication.run(MusicserverApplication.class, args);
}
}
error展示