Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
P
promotion-common
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
promotion
promotion-common
Commits
bc2238db
提交
bc2238db
authored
5月 30, 2024
作者:
李秋林
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
添加工具:MD5密码生成与校验;
上级
ac4d8b55
隐藏空白字符变更
内嵌
并排
正在显示
4 个修改的文件
包含
133 行增加
和
3 行删除
+133
-3
RedisKeys.java
...java/com/wangxiaolu/promotion/common/redis/RedisKeys.java
+1
-1
JwtUtils.java
...n/java/com/wangxiaolu/promotion/common/util/JwtUtils.java
+24
-2
MD5Utils.java
...n/java/com/wangxiaolu/promotion/common/util/MD5Utils.java
+107
-0
RCode.java
.../java/com/wangxiaolu/promotion/result/basedata/RCode.java
+1
-0
没有找到文件。
src/main/java/com/wangxiaolu/promotion/common/redis/RedisKeys.java
浏览文件 @
bc2238db
...
...
@@ -13,7 +13,7 @@ public interface RedisKeys {
*/
PHONE_VER_CODE
(
"user:phone_code:phone_"
),
/**
* 用户登录信息:token
*
促销员小程序
用户登录信息:token
*/
TEMPORARY_TOKEN
(
"user:login_token:temporary:"
),
;
...
...
src/main/java/com/wangxiaolu/promotion/common/util/JwtUtils.java
浏览文件 @
bc2238db
...
...
@@ -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
());
}
}
...
...
src/main/java/com/wangxiaolu/promotion/common/util/MD5Utils.java
0 → 100644
浏览文件 @
bc2238db
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
));
}
}
src/main/java/com/wangxiaolu/promotion/result/basedata/RCode.java
浏览文件 @
bc2238db
...
...
@@ -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
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论