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的方式进行加密,下面对密码加密的步骤总结:
-
获取原始密码:首先,定义一个字符串变量
password
,赋予要加密的原始密码值。 -
创建MessageDigest实例:使用
MessageDigest.getInstance("MD5")
获取MD5算法的实例,MessageDigest 类提供了消息摘要算法的功能。 -
计算摘要:调用
md.digest(password.getBytes())
方法对输入的密码进行摘要计算,得到一个表示摘要的字节数组。MD5算法会将输入的密码转换为128位的摘要。 -
转换为十六进制字符串:遍历摘要的字节数组,对每个字节进行位运算和转换为两位的十六进制字符串。将每个字节转换为十六进制的目的是为了生成可读的、固定长度的表示形式。
-
结果:最终,
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等