提交 bc2238db authored 作者: 李秋林's avatar 李秋林

添加工具:MD5密码生成与校验;

上级 ac4d8b55
......@@ -13,7 +13,7 @@ public interface RedisKeys {
*/
PHONE_VER_CODE("user:phone_code:phone_"),
/**
* 用户登录信息:token
* 促销员小程序用户登录信息:token
*/
TEMPORARY_TOKEN("user:login_token:temporary:"),
;
......
......@@ -20,10 +20,15 @@ public class JwtUtils {
/**
* 促销员-解密秘钥
* 促销员小程序-促销员token-加解密秘钥
*/
@Value("${wx.miniapp.temporary.token_secret}")
private String TEMPORARY_SECRET;
/**
* 促销员小程序-员工token-加解密秘钥
*/
@Value("${wx.miniapp.employee.token_secret}")
private String EMPLOYEE_SECRET;
public String getTemporaryToken(String openId, String phone) {
try {
......@@ -37,7 +42,24 @@ public class JwtUtils {
.sign(algorithm);
return jwtToken;
} catch (Exception e) {
log.error("用户{}的token生成异常:{}", openId, e);
log.error("促销员小程序-促销员{}登录token生成异常:{}", openId, e);
throw new ParamException(RCode.LOGIN_PARAM_ERROR, e.getMessage());
}
}
public String getEmployeeToken(String username, String password) {
try {
//用秘钥生成签名
Algorithm algorithm = Algorithm.HMAC256(EMPLOYEE_SECRET);
//默认头部+载荷(手机号/id)+签名=jwt
String jwtToken = JWT.create()
.withClaim("username", username)
.withClaim("password", password)
.withClaim("time", System.currentTimeMillis())
.sign(algorithm);
return jwtToken;
} catch (Exception e) {
log.error("促销员小程序-员工{}后台登录token生成异常:{}", username, e);
throw new ParamException(RCode.LOGIN_PARAM_ERROR, e.getMessage());
}
}
......
package com.wangxiaolu.promotion.common.util;
import java.security.MessageDigest;
import java.util.Random;
/**
* @author : liqiulin
* @date : 2024-05-29 11
* @describe : 密码加密工具
*/
public class MD5Utils {
/**
* byte[]字节数组 转换成 十六进制字符串
* @param arr 要转换的byte[]字节数组
* @return String 返回十六进制字符串
*/
private static String hex(byte[] arr) {
StringBuffer sb = new StringBuffer();
for (int i = 0; i < arr.length; ++i) {
sb.append(Integer.toHexString((arr[i] & 0xFF) | 0x100).substring(1, 3));
}
return sb.toString();
}
/**
* MD5加密,并把结果由字节数组转换成十六进制字符串
* @param str 要加密的内容
* @return String 返回加密后的十六进制字符串
*/
private static String md5Hex(String str) {
try {
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] digest = md.digest(str.getBytes());
return hex(digest);
} catch (Exception e) {
e.printStackTrace();
System.out.println(e.toString());
return "";
}
}
/**
* 生成含有随机盐的密码
* @param password 要加密的密码
* @return String 含有随机盐的密码
*/
public static String getSaltMD5(String password) {
// 生成一个16位的随机数
Random random = new Random();
StringBuilder sBuilder = new StringBuilder(16);
sBuilder.append(random.nextInt(99999999)).append(random.nextInt(99999999));
int len = sBuilder.length();
if (len < 16) {
for (int i = 0; i < 16 - len; i++) {
sBuilder.append("0");
}
}
// 生成最终的加密盐
String salt = sBuilder.toString();
password = md5Hex(password + salt);
char[] cs = new char[48];
for (int i = 0; i < 48; i += 3) {
cs[i] = password.charAt(i / 3 * 2);
char c = salt.charAt(i / 3);
cs[i + 1] = c;
cs[i + 2] = password.charAt(i / 3 * 2 + 1);
}
return String.valueOf(cs);
}
/**
* 验证加盐后是否和原密码一致
* @param password 原密码
* @param md5str 加密之后的密码
*@return boolean true表示和原密码一致 false表示和原密码不一致
*/
public static boolean getSaltverifyMD5(String password, String md5str) {
char[] cs1 = new char[32];
char[] cs2 = new char[16];
for (int i = 0; i < 48; i += 3) {
cs1[i / 3 * 2] = md5str.charAt(i);
cs1[i / 3 * 2 + 1] = md5str.charAt(i + 2);
cs2[i / 3] = md5str.charAt(i + 1);
}
String Salt = new String(cs2);
return md5Hex(password + Salt).equals(String.valueOf(cs1));
}
public static void main(String[] args) {
// 原密码
String plaintext = "wxl000516";
// 获取加盐后的MD5值
String ciphertext = MD5Utils.getSaltMD5(plaintext);
System.out.println("加盐后MD5:" + ciphertext);
System.out.println("是否是同一字符串:" + MD5Utils.getSaltverifyMD5(plaintext, ciphertext));
}
}
......@@ -42,6 +42,7 @@ public enum RCode implements StatusCode {
CLOCK_DETAIL_TIME_ERROR(3006, "不在打卡时间范围内"),
CHARGER_ID_ERROR(3007, "未找到负责人"),
NOT_LOGIN_ERROR(3008, "您尚未登录"),
LOGIN_PASSWORD_ERROR(3009, "密码错误"),
/**
* promotion-模块异常
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论