修正示例

This commit is contained in:
click33 2023-05-21 06:54:45 +08:00
parent fe4a5e100b
commit 3e293ca5e0

View File

@ -47,7 +47,7 @@ public SaResult addMoney(long userId, long money) {
``` java ``` java
long userId = 10001; long userId = 10001;
long money = 1000; long money = 1000;
String res = HttpUtil.request("http://a.com/api/addMoney?userId=" + userId + "&money=" + money); String res = HttpUtil.request("http://b.com/api/addMoney?userId=" + userId + "&money=" + money);
``` ```
上述代码简单的完成了需求,但是很明显它有一个安全问题: 上述代码简单的完成了需求,但是很明显它有一个安全问题:
@ -82,7 +82,7 @@ public SaResult addMoney(long userId, long money, String secretKey) {
long userId = 10001; long userId = 10001;
long money = 1000; long money = 1000;
String secretKey = "xxxxxxxxxxxxxxxxxxxx"; String secretKey = "xxxxxxxxxxxxxxxxxxxx";
String res = HttpUtil.request("http://a.com/api/addMoney?userId=" + userId + "&money=" + money + "&secretKey=" + secretKey); String res = HttpUtil.request("http://b.com/api/addMoney?userId=" + userId + "&money=" + money + "&secretKey=" + secretKey);
``` ```
现在,即使 B 系统的接口被暴露了,也不会被陌生人任意调用了,安全性得到了一定的保证,但是仍然存在一些问题: 现在,即使 B 系统的接口被暴露了,也不会被陌生人任意调用了,安全性得到了一定的保证,但是仍然存在一些问题:
@ -103,10 +103,10 @@ long money = 1000;
String secretKey = "xxxxxxxxxxxxxxxxxxxx"; String secretKey = "xxxxxxxxxxxxxxxxxxxx";
// 计算 sign 参数 // 计算 sign 参数
String sign = md5("userId=" + userId + "&money=" + money + "&key=" + secretKey); String sign = md5("money=" + money + "&userId=" + userId + "&key=" + secretKey);
// 将 sign 拼接在请求地址后面 // 将 sign 拼接在请求地址后面
String res = HttpUtil.request("http://a.com/api/addMoney?userId=" + userId + "&money=" + money + "&sign=" + sign); String res = HttpUtil.request("http://b.com/api/addMoney?userId=" + userId + "&money=" + money + "&sign=" + sign);
``` ```
**注意此处计算签名时需要将所有参数按照字典顺序依次排列key除外挂在最后面。**以下所有计算签名时同理,不再赘述。 **注意此处计算签名时需要将所有参数按照字典顺序依次排列key除外挂在最后面。**以下所有计算签名时同理,不再赘述。
@ -120,7 +120,7 @@ String res = HttpUtil.request("http://a.com/api/addMoney?userId=" + userId + "&m
public SaResult addMoney(long userId, long money, String sign) { public SaResult addMoney(long userId, long money, String sign) {
// 在 B 系统,使用同样的算法、同样的密钥,计算出 sign2与传入的 sign 进行比对 // 在 B 系统,使用同样的算法、同样的密钥,计算出 sign2与传入的 sign 进行比对
String sign2 = md5("userId=" + userId + "&money=" + money + "&key=" + secretKey); String sign2 = md5("money=" + money + "&userId=" + userId + "&key=" + secretKey);
if( ! sign2.equals(sign)) { if( ! sign2.equals(sign)) {
return SaResult.error("无效 sign无法响应请求"); return SaResult.error("无效 sign无法响应请求");
} }
@ -159,10 +159,10 @@ String nonce = SaFoxUtil.getRandomString(32); // 随机32位字符串
String secretKey = "xxxxxxxxxxxxxxxxxxxx"; String secretKey = "xxxxxxxxxxxxxxxxxxxx";
// 计算 sign 参数 // 计算 sign 参数
String sign = md5("userId=" + userId + "&money=" + money + "&nonce=" + nonce + "&key=" + secretKey); String sign = md5("money=" + money + "&nonce=" + nonce + "&userId=" + userId + "&key=" + secretKey);
// 将 sign 拼接在请求地址后面 // 将 sign 拼接在请求地址后面
String res = HttpUtil.request("http://a.com/api/addMoney?userId=" + userId + "&money=" + money + "nonce=" + nonce + "&sign=" + sign); String res = HttpUtil.request("http://b.com/api/addMoney?userId=" + userId + "&money=" + money + "nonce=" + nonce + "&sign=" + sign);
``` ```
然后在 B 系统接收请求时,也把 nonce 参数加进去生成 sign 字符串,进行比较: 然后在 B 系统接收请求时,也把 nonce 参数加进去生成 sign 字符串,进行比较:
@ -178,7 +178,7 @@ public SaResult addMoney(long userId, long money, String nonce, String sign) {
} }
// 2、验证签名 // 2、验证签名
String sign2 = md5("userId=" + userId + "&money=" + money + "&nonce=" + nonce + "&key=" + secretKey); String sign2 = md5("money=" + money + "&nonce=" + nonce + "&userId=" + userId + "&key=" + secretKey);
if( ! sign2.equals(sign)) { if( ! sign2.equals(sign)) {
return SaResult.error("无效 sign无法响应请求"); return SaResult.error("无效 sign无法响应请求");
} }
@ -226,10 +226,10 @@ long timestamp = System.currentTimeMillis(); // 随机32位字符串
String secretKey = "xxxxxxxxxxxxxxxxxxxx"; String secretKey = "xxxxxxxxxxxxxxxxxxxx";
// 计算 sign 参数 // 计算 sign 参数
String sign = md5("userId=" + userId + "&money=" + money + "&nonce=" + nonce + "&timestamp=" + timestamp + "&key=" + secretKey); String sign = md5("money=" + money + "&nonce=" + nonce + "&timestamp=" + timestamp + "&userId=" + userId + "&key=" + secretKey);
// 将 sign 拼接在请求地址后面 // 将 sign 拼接在请求地址后面
String res = HttpUtil.request("http://a.com/api/addMoney" + String res = HttpUtil.request("http://b.com/api/addMoney" +
"?userId=" + userId + "&money=" + money + "&nonce=" + nonce + "&timestamp=" + timestamp + "&sign=" + sign); "?userId=" + userId + "&money=" + money + "&nonce=" + nonce + "&timestamp=" + timestamp + "&sign=" + sign);
``` ```
@ -333,10 +333,10 @@ long timestamp = System.currentTimeMillis(); // 当前时间戳
String secretKey = "xxxxxxxxxxxxxxxxxxxx"; String secretKey = "xxxxxxxxxxxxxxxxxxxx";
// 计算 sign 参数 // 计算 sign 参数
String sign = md5("userId=" + userId + "&money=" + money + "&nonce=" + nonce + "&timestamp=" + timestamp + "&key=" + secretKey); String sign = md5("money=" + money + "&nonce=" + nonce + "&timestamp=" + timestamp + "&userId=" + userId + "&key=" + secretKey);
// 将 sign 拼接在请求地址后面 // 将 sign 拼接在请求地址后面
String res = HttpUtil.request("http://a.com/api/addMoney" + String res = HttpUtil.request("http://b.com/api/addMoney" +
"?userId=" + userId + "&money=" + money + "&nonce=" + nonce + "&timestamp=" + timestamp + "&sign=" + sign); "?userId=" + userId + "&money=" + money + "&nonce=" + nonce + "&timestamp=" + timestamp + "&sign=" + sign);
``` ```
@ -360,7 +360,7 @@ public SaResult addMoney(long userId, long money, long timestamp, String nonce,
} }
// 3、验证签名 // 3、验证签名
String sign2 = md5("userId=" + userId + "&money=" + money + "&nonce=" + nonce + "&key=" + secretKey); String sign2 = md5("money=" + money + "&nonce=" + nonce + "&timestamp=" + timestamp + "&userId=" + userId + "&key=" + secretKey);
if( ! sign2.equals(sign)) { if( ! sign2.equals(sign)) {
return SaResult.error("无效 sign无法响应请求"); return SaResult.error("无效 sign无法响应请求");
} }
@ -423,7 +423,7 @@ sa-token:
``` java ``` java
// 请求地址 // 请求地址
String url = "http://a.com/api/addMoney"; String url = "http://b.com/api/addMoney";
// 请求参数 // 请求参数
Map<String, Object> paramMap = new LinkedHashMap<>(); Map<String, Object> paramMap = new LinkedHashMap<>();