前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【从0做项目】Java音缘心动(3)———加密算法 & MD5 & BCrypt

【从0做项目】Java音缘心动(3)———加密算法 & MD5 & BCrypt

作者头像
三三是该溜子
发布2025-02-22 19:43:08
发布2025-02-22 19:43:08
10300
代码可运行
举报
文章被收录于专栏:该溜子的专栏该溜子的专栏
运行总次数:0
代码可运行

零:项目结果展示

项目目前已经上线

音乐播放器登录页面铁子们可以后台私信获取管理员用户和密码

一:音乐播放器Web网页介绍

这个网页主要的功能包括:用户登录,上传音乐,播放音乐,收藏音乐到喜欢列表,从喜欢列表中移除音乐,删除指定音乐,批量删除音乐,

二:加密算法介绍

我们的密码保存在数据库当中,如果数据库被黑了,密码被泄露就g了,这里我们就可以对密码进行加密,下面介绍两种加密算法

1:MD5加密

输⼊两个不同的明⽂不会得到相同的输出值 根据输出值,不能得到原始的明⽂——就是过程不可逆,但是现在除了彩虹表,这样的密码也不安全了,有兴趣的老铁可以了解一下。

(1)引入md5算法相关依赖
代码语言:javascript
代码运行次数:0
运行
复制
        <!-- 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(传入字符串)经过某种算法后得到一个新的加密后的字符串

代码语言:javascript
代码运行次数:0
运行
复制
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)引入依赖
代码语言:javascript
代码运行次数:0
运行
复制
        <!-- 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)测试
代码语言:javascript
代码运行次数:0
运行
复制
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加密后的密文存储在数据库当中。

代码语言:javascript
代码运行次数:0
运行
复制
 @Configuration
    public class AppConfig {
        @Bean
        public BCryptPasswordEncoder getBCryptPasswordEncoder() {
            return new BCryptPasswordEncoder();
        }
    }

四:配置启动类

当启动类,没有加这个过滤的时候,我们发现不能进⾏登录,这是因为在SpringBoot中,默认的Spring Security⽣效了的,此时的接⼝都是被保护的。

此时我们做一些特定的操作可能会被拦截,比如说我们在开发或者测试期间使用某些算法加密,这里我们使用了Scrypt加密嘛,所以就被拦截了

此时通过下述exclude配置,即可禁⽤默认的登录验证。

代码语言:javascript
代码运行次数:0
运行
复制
@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展示

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-02-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 零:项目结果展示
  • 一:音乐播放器Web网页介绍
  • 二:加密算法介绍
    • 1:MD5加密
      • (1)引入md5算法相关依赖
      • (2)加盐提高安全性——测试代码
      • (3)结果
    • 2:BCrypt加密设计
      • (1)引入依赖
      • (2)简单理解
      • (3)测试
    • 3:总结
  • 三:创建配置Config包
  • 四:配置启动类
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档