md5密码加密详细教程

本文详细介绍了在SpringBoot2.7.17项目中,如何使用MD5算法对用户注册时的密码进行加密,以及在登录验证时如何解密。同时讨论了MD5的优缺点及其在安全性上的局限性。
摘要由CSDN通过智能技术生成

javaJDK开发环境:jdk8 + springBoot

springBoot版本号2.7.17

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.7.17</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

注册密码加密过程:

实体类:

package com.example.demo.pojo.system;

import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;

import java.util.Date;

@Data
@TableName("system_user")
public class SystemUser {

  @TableId
  private long id;
  private String userId;
  private long roleId;
  private String name;
  private String accountName;
  private String accountPassword;
  private String phoneNumber;
  private String email;
  private long status;
  private String createdBy;
  @TableField(fill = FieldFill.INSERT)
  private Date createdTime;
  @TableField(fill = FieldFill.INSERT_UPDATE)
  private Date updatedTime;
  private String updatedBy;
  @TableLogic
  private long deleted;
  @TableField(fill = FieldFill.INSERT)
  private Date registerTime;
  private String verificationCode;

}

Mapper接口:

package com.example.demo.mapper.system;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.demo.pojo.system.SystemUser;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface UserMapper extends BaseMapper<SystemUser> {
}

Service接口:
 

    /**
     * 注册用户
     * @param user
     * @return
     */
    int registerUser (SystemUser user);

ServiceImpl实现类:


    @Autowired
    private UserMapper userMapper;

/**
     * 注册功能
     * @param user
     * @return
     */

    @Override
    public int registerUser(SystemUser user) {
        //设置用户id
        user.setUserId(UUID.randomUUID().toString());
      

        //原始密码
        String password = user.getAccountPassword();
        MessageDigest md = null;
        try {
            md = MessageDigest.getInstance("MD5");
        } catch (NoSuchAlgorithmException e) {
            throw new RuntimeException(e);
        }
        //对输入的密码进行摘要计算,得到一个表示摘要的字节数组。MD5算法会将输入的密码转换为128位的摘要
        byte[] digest = md.digest(password.getBytes());
        StringBuilder sb = new StringBuilder();
        //遍历摘要的字节数组,对每个字节进行位运算和转换为两位的十六进制字符串
        for (byte b : digest) {
            sb.append(Integer.toHexString((b & 0xFF) | 0x100).substring(1,3));
        }
        user.setAccountPassword(sb.toString());
        return userMapper.insert(user);
    }

Controller层

       @Autowired
    private LoginService loginService;


 /**
     * 注册用户功能
     *
     * @param user
     * @return
     */
    @PostMapping("/registerUser")
    public int registerUser (@RequestBody SystemUser user){
        return loginService.registerUser(user);
    }

以上代码对于注册功能的实现,在输入用户密码之后,将密码通过md5的方式进行加密,下面对密码加密的步骤总结:

  1. 获取原始密码:首先,定义一个字符串变量password,赋予要加密的原始密码值。

  2. 创建MessageDigest实例:使用MessageDigest.getInstance("MD5")获取MD5算法的实例,MessageDigest 类提供了消息摘要算法的功能。

  3. 计算摘要:调用md.digest(password.getBytes())方法对输入的密码进行摘要计算,得到一个表示摘要的字节数组。MD5算法会将输入的密码转换为128位的摘要。

  4. 转换为十六进制字符串:遍历摘要的字节数组,对每个字节进行位运算和转换为两位的十六进制字符串。将每个字节转换为十六进制的目的是为了生成可读的、固定长度的表示形式。

  5. 结果:最终,StringBuilder对象sb中存储的就是经过MD5算法加密后的十六进制字符串表示形式的密码摘要

登录输入密码:

如果使用刚刚注册的用户登录,那么输入加密过后的密码还是原密码呢?

密码加密只是为了保证用户的密码不被恶意攻击者获取和利用,从而增强系统的安全性

在我们登录的时候,还是需要自己设置的原密码:

这就需要对用户输入的密码进行转换

 /**
     * 处理登录流程
     * @param accountName
     * @param accountPassword
     * @return
     */
    @Override
    public ResponseEntity<Map<String, String>> getUserInfo(String accountName, String accountPassword) {
    
        //判断用户是否存在
        if(null != user) {
            // 存储的哈希是加密后的密码
            MessageDigest md = null;
            try {
                md = MessageDigest.getInstance("MD5");
            } catch (NoSuchAlgorithmException e) {
                throw new RuntimeException(e);
            }
            byte[] digestOfInputPassword = md.digest(accountPassword.getBytes());
            // 将输入密码的哈希值转换为十六进制字符串
            StringBuilder hexString = new StringBuilder();
            for (byte b : digestOfInputPassword) {
                String hex = Integer.toHexString(0xff & b);
                if (hex.length() == 1) hexString.append('0');
                hexString.append(hex);
            }
//将用户输入的密码和数据库中加密后的密码进行比较
//如果结果为true,说明密码正确,反之
            boolean passwordFlag = hexString.toString().equals(user.getAccountPassword());

      
    }

以上就是md5密码加密的过程

注意:md5编码的缺点

对于相同的输入密码,经过MD5算法加密后的结果也会是相同的。这是哈希算法的特性之一,即相同的输入将产生相同的输出。这种特性使得MD5在验证密码时很有用:当用户输入密码时,系统只需将用户输入的密码进行MD5加密,然后与存储在数据库中的MD5加密后的密码进行比较,而无需存储用户原始的明文密码,从而增加了安全性。

然而,正是因为这种特性,在安全性要求较高的情况下,MD5的使用受到了限制。由于MD5存在碰撞(即不同的输入可能产生相同的输出)和安全性等问题,不再被推荐用于安全领域。在实际应用中,建议选择更安全的哈希算法,如SHA-256等

  • 12
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值