MD5加密工具类(实战版)

2023-05-16

MD5加密工具类(实战版)

提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
例如:第一章 Python 机器学习入门之pandas的使用


提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • MD5加密工具类(实战版)
  • 前言
  • 一、MD5加密算法介绍(使用步骤在下面)
  • 二、使用步骤
    • 1.建立一个工具类
    • 2.Controller层


前言

提示:这里可以添加本文要记录的大概内容:

例如:写这篇博客初衷是记录学习笔记,加深对该技术栈的理解,同时呢,分享给大家,一起学习,下面是结合本人实战经验使用的过程。


提示:以下是本篇文章正文内容,下面案例可供参考

一、MD5加密算法介绍(使用步骤在下面)

1.MD5全称:message-digest algorithm 5(信息-摘要算法),是一个非对称加密算法;
2. 认识:使用MD5可以将整个文件当做一个大文本信息,通过不可逆的字符串变换算法,产生一个唯一的MD5信息摘要;
3. 算法内容概述:MD5以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组,经过了一系列的处理后,算法的输出由四个32位分组组成,将这四个32位分组级联后将生成一个128位散列值。
4. 特点:

  1. 压缩性, 任意长度的数据,算出的md5值得长度都是固定的。2. 具有高度的离散性, md5码具有高度的散列性,没有规律可循,哪怕原信息只有一点点的变化,比如几个空格,也就会导致md5发生巨大变化,可以说产生的md5码是不可预测的。3.不可逆, 没有系统有办法知道md5原来的文字是什么。 4. 弱碰撞性, 已知原数据和其md5的值,想找到一个具有相同md5值得数据(即伪造数据)是非常困难的。

5.用途:

简单介绍几个
“密码的加密存储”, 用户设置密码时,服务端只记录这个密码的MD5,而不记录密码本身,以后验证用户身份时,只需要将用户输入的密码再次做一下MD5后,与记录的MD5作一个比较即可验证其密码的合法性。本人最经常使用MD5就是用户的登录注册,哈哈。
“数字签名”,比如发布一个程序,为了防止别人在你的程序里插入病毒或木马,你可以在发布这个程序的同时,公开这个程序文件的MD5码,别人只需要在任何地方下载这个程序后做一次MD5,然后跟公开的这个MD5作一个比较就知道这个程序是否被第三方修改过,起到安全性的作用。

6.此篇博客使用MD5加密算法的场景
在这里插入图片描述

二、使用步骤

1.建立一个工具类

:MD5Util.java,本篇结合springboot使用

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

/**
 * Created with IntelliJ IDEA.
 * MD5加密类
 *
 * @return    加密后的字符串复制到数据库
 * @Author: zhangliang
 * @Date: 2021/10/24/15:52
 * @Description: MD5加密工具类
 */
public class MD5Utils {
    public static String code(String str){
        try {
            MessageDigest md = MessageDigest.getInstance("MD5");
            md.update(str.getBytes());
            byte[]byteDigest = md.digest();
            int i;
            StringBuffer buf = new StringBuffer("");
            for (int offset = 0; offset < byteDigest.length; offset++) {
                i = byteDigest[offset];
                if (i < 0)
                    i += 256;
                if (i < 16)
                    buf.append("0");
                buf.append(Integer.toHexString(i));
            }
            //32位加密
            return buf.toString();
            // 16位的加密
            //return buf.toString().substring(8, 24);
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
            return null;
        }

    }


    //测试数据
    public static void main(String[] args) {
        System.out.println(code("1999"));
    }
}

2.Controller层

LoginController.java

/**
 * Created with IntelliJ IDEA.
 *
 * @Author: zhangliang
 * @Date: 2021/10/21/19:47
 * @Description:  login 和 loginout
 */
@Controller
@RequestMapping("/admin")
@CrossOrigin
public class LoginController {
    @Autowired
    private UserService userService;

    //跳转登录页面
    @GetMapping
    public String LoginPage(){
        return "admin/login";
    }

    //登录
    @PostMapping("/login")
    public String login(@RequestParam  String username,
                        @RequestParam  String password,
                        HttpSession session,
                        Model model) {
        System.out.println(username+password);
        User user = userService.checkUser(username, password);
        System.out.println(user);
        //避免将密码传到前端
        if (user != null) {
            user.setPassWord(null);
            session.setAttribute("user", user);
            return "admin/index";

        } else {
        //重定向传输的信息要用RedirectAttributes,使用Model拿不
            //attributes.addFlashAttribute("message", "用户名或密码错误");
            //session.setAttribute("message", "用户名或密码错误");
            //model.addAttribute("message", "用户名或密码错误");
            return "admin/login";
        }
    }

    //注销登录
    @GetMapping("/logout")
    public String logout(HttpSession httpSession) {
        httpSession.removeAttribute("user");
        return "redirect:/admin";
    }
}

service层

/**
 * Created with IntelliJ IDEA.
 *
 * @Author: zhangliang
 * @Date: 2021/10/21/19:20
 * @Description:  service层
 */
public interface UserService {
    User checkUser(String username,String password);
}

ServiceImpl层

/**
 * Created with IntelliJ IDEA.
 *
 * @Author: zhangliang
 * @Date: 2021/10/21/19:22
 * @Description: ServiceImpl
 */
@Service
public class UserServiceImpl implements UserService{

    @Autowired
    private UserRepository userRepository;

    @Override
    public User checkUser(String username, String password) {
        User user = userRepository.findByUserNameAndPassWord(username, MD5Utils.code(password));
        return user;
    }
}

持久层使用的是jpa

/**
 * Created with IntelliJ IDEA.
 * 本身只封装了数据库的基本操作,复杂的操作需要自行定义
 * @Author: zhangliang
 * @Date: 2021/10/21/19:26
 * @Description:
 */
public interface UserRepository extends JpaRepository<User, Long> {

    User findByUserNameAndPassWord(String userName, String Password);

}

前端页面,使用的是thymeleaf引擎

<!DOCTYPE html>
<html lang="en"  xmlns:th="http://www.w3.org/1999/xhtml">

<head th:replace="admin/_fragments :: head(~{::title})">
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width,initial-scale=1.0">
    <title>博客管理登录</title>
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/semantic-ui@2.4.2/dist/semantic.min.css">
   <link rel="stylesheet" href="../../static/css/me.css" th:href="@{/css/me.css}">
    <!--动画效果css-->
    <link rel="stylesheet" href="../../static/css/animate.css" th:href="@{/css/me.css}">
</head>
<body>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<div class="m-container-small m-padded-tb-massive aligned center" style="max-width:30em !important ">
    <div class="ui container ">
        <div class="ui middle aligned center aligned grid">
            <div class="column">
                <h2 class="ui teal image header">
                    <img src="https://picsum.photos/id/1005/1000/400" style="width: 40px;height: 40px" class="ui medium circular image">
                    <div class="content"><trans oldtip=" Log-in to your account " newtip="登录到您的帐户"> 管理后台登录 </trans></div>
                </h2>
                <form class="ui large form" method="post" action="#" th:action="@{/admin/login}">
                    <div class="ui segment">
                        <div class="field">
                            <div class="ui left icon input">
                                <i class="user icon"></i>
                                <input type="text" name="username" placeholder="用户名">
                            </div>
                        </div>
                        <div class="field">
                            <div class="ui left icon input">
                                <i class="lock icon"></i>
                                <input type="password" name="password" placeholder="密码">
                            </div>
                        </div>
                        <button class="ui fluid large teal submit button">登录</button>
                    </div>

                    <div class="ui error message"></div>
                    <div class="ui mini negative message" th:unless="${#strings.isEmpty(message)}" th:text="${message}">用户名和密码错误</div>

                </form>

<!--                <div class="ui message"><trans oldtip=" New to us? " newtip="对我们来说是新的吗?"> New to us? </trans><a href="#"><trans oldtip="Sign Up" newtip="注册">Sign Up</trans></a>-->
<!--                </div>-->
            </div>
        </div>

    </div>
</div>



<script src="https://cdn.jsdelivr.net/npm/jquery@3.2/dist/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/semantic-ui@2.4.2/dist/semantic.min.js"></script>


<script>
    <!-- 登录表单验证-->
    $('.ui.form').form({
        fields : {
            username : {
                identifier : 'username' ,
                rules: [{
                    type:'empty',
                    prompt: '请输入用户名'
                }]
            },

            password : {
                identifier : 'password' ,
                rules: [{
                    type:'empty',
                    prompt: '请输入密码'
                }]
            }
        }
    });
</script>

</body>
</html>

注意:技术可以的话,只用使用MD5工具类计即可,本文是在springboot +jpa(持久层,后续有时间补充一下mybatis的版本) 的基础上使用MD5的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MD5加密工具类(实战版) 的相关文章

  • Pytorch 中net.train() 和 net.eval()的作用和如何使用?

    一般在训练模型的代码段加入 xff1a model train 在测试模型时候加入 xff1a model eval 同时发现 xff0c 如果不写这两个程序也可以运行 xff0c 这是因为这两个方法是针对在网络训练和测试时采用不同方式的情
  • Qt 子窗口内嵌到父窗口中

    有时需要把一个子窗口内嵌进入父窗口当中 我们可以这样做 1 新建一个QWidget 或者QDialog的子类 ClassA xff08 父类为ClassB xff09 2 在新建类的构造函数中添加设置窗口属性 setWindowFlags
  • 用Cmake 编译OpenCV常见的错误

    minGW32 make遇到的错误1 xff1a 37 Linking CXX shared library bin libopencv core341 dll CMakeFiles opencv core dir objects a me
  • 卷积 反卷积 上采样 下采样 区别

    1 卷积 就是利用卷积核 步长前进 卷积整个图片 2 反卷积 反卷积的具体操作 原图输入尺寸为 1 xff0c 3 xff0c 3 xff0c 3 对应 batch size channels width height 反卷积tconv 6
  • Go语言操作数据库MySQL

    连接 Go语言中的database sql包提供了保证SQL或类SQL数据库的泛用接口 xff0c 并不提供具体的数据库驱动 使用database sql包时必须注入 xff08 至少 xff09 一个数据库驱动 我们常用的数据库基本上都有
  • 解决Git请求错误问题

    git clone gits github com Cloning into 39 FdogSerialize 39 git 39 remote gits 39 is not a git command See 39 git help 39
  • Reactor 模式

    Reactor 翻译过来的意思是 反应堆 xff0c 可能大家会联想到物理学里的核反应堆 xff0c 实际上并不是的这个意思 这里的反应指的是 对事件反应 xff0c 也就是来了一个事件 xff0c Reactor 就有相对应的反应 响应
  • MATLAB画图调整分辨率

    问题 xff1a 经常需要用MATLAB画图 xff0c 但是保存之后分辨率不高 xff0c 特别是需要放大的情况下 解决 xff1a 对于下面这种画出的图形 选择 文件 61 gt 导出设置 61 gt 渲染 61 gt 分辨率 选择60
  • C语言中常见的逻辑错误

    常见错误一 xff1a 61 和 61 61 混在一起 int main int ret if ret 61 1 return 0 结果 xff1a 变量被错误赋值 xff0c 逻辑判断错误 错误二 xff1a 定义较大的全局变量造成 编译
  • Qt中常见的位置和尺寸

    QPoint类的介绍 QPoint 类封装了我们常用用到的坐标点 x y 常用的 API 如下 构造函数 构造一个坐标原点 即 0 0 QPoint QPoint 参数为 x轴坐标 y轴坐标 QPoint QPoint int xpos i
  • 关于QT线程运用的三种方式

    QThread 类函数 QThread 类常用 API 构造函数 QThread QThread QObject parent 61 Q NULLPTR 判断线程中的任务是不是处理完毕了 bool QThread isFinished co
  • 安装Ubuntu22.04+nvidia驱动+CUDA-11.7+GRPMACS patch PLUMED

    首先是Ubuntu22 4的安装 Ubuntu系统一般直接可以使用RUFUS软件制作U盘启动项 xff0c 再依照顺序安装Ubuntu系统 xff0c 这里不赘述 CUDA 11 7 span class token function su
  • Linux部署Nexus私服

    这篇文章主要介绍了Linux搭建自己Nexus私服的实现方法 xff0c 文中通过示例代码介绍的非常详细 xff0c 对大家的学习或者工作具有一定的参考学习价值 一 Nexus介绍 对maven来说仓库分为两类 xff1a 本地仓库和远程仓
  • 元学习和机器学习的对比

    目录 引言机器学习元学习什么是元学习元学习的流程学习学习函数评价学习函数好坏迭代优化 整体框架 元学习和机器学习的对比定义的区别数据集划分的区别损失函数的区别两者之间的共通之处 总结 引言 本篇博客是李宏毅老师元学习课程的笔记 深度学习大部
  • 如何使用C++实现10个数的冒泡排序

    96 96 冒泡排序是一种计算机科学领域的较简单的排序算法 xff0c 是一种简单的适合初学者学习的算法 上图为冒泡排序简单的图片理解 xff0c 将第一个数依次与后面的数进行比较 将数值大的数沉到底部或将数值小的数浮到顶部 简称 大数沉淀
  • 通过Cerebro访问Elasticsearch

    本文以阿里云Elasticsearch为例 xff0c 介绍通过Cerebro访问Elasticsearch的方法 阿里云Elasticsearch兼容开源Elasticsearch的功能 xff0c 以及Security Machine
  • 手把手教您完成Elasticsearch数据迁移

    您可以通过Logstash reindex和OSS等多种方式在Elasticsearch之间迁移数据 本文以阿里云Elasticsearch xff08 简称ES xff09 为例 xff0c 介绍阿里云Elasticsearch间数据迁移
  • Solr集群数据迁移至Elasticsearch

    Elasticsearch是一款非常强大的搜索引擎 xff0c 可以让你在海量的数据中快速找到想要的内容 例如 xff0c 代码搜索 xff1a 可以帮助您找到相应的代码仓库 xff0c 还可以实现代码级的搜索及高亮显示 xff1b 网上s
  • k8s创建Deployment报错:no matches for kind “Deployment“ in version “extensions/v1beta1“

    报错类型 xff1a root 64 master kubectl create f lzb test yaml error unable to recognize 34 lzb test yaml 34 no matches for ki
  • 3分钟学会使用Elasticsearch跨集群复制功能(CCR)

    当您需要将本地Elasticsearch集群中的索引数据迁移到一个远程集群中 xff0c 或者将一个远程集群中的索引数据迁移到本地集群 xff0c 可通过跨集群复制CCR xff08 Cross Cluster Replication xf

随机推荐