diff --git a/mallinkCallback/src/main/java/com/iformall/controller/device/KwBoxV1Controller.java b/mallinkCallback/src/main/java/com/iformall/controller/device/KwBoxV1Controller.java index e5282829b..5559503c1 100644 --- a/mallinkCallback/src/main/java/com/iformall/controller/device/KwBoxV1Controller.java +++ b/mallinkCallback/src/main/java/com/iformall/controller/device/KwBoxV1Controller.java @@ -11,9 +11,14 @@ import com.iformall.enums.EnumBoxRegisterStatus; import com.iformall.service.kw.KwBoxCmdHistoryService; import com.iformall.service.kw.KwBoxService; +import com.iformall.utils.HashUtil; +import com.iformall.utils.Utility; +import com.sun.crypto.provider.HmacSHA1; import io.netty.util.internal.StringUtil; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; +import org.apache.commons.codec.digest.HmacAlgorithms; +import org.apache.commons.codec.digest.HmacUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -82,6 +87,7 @@ public class KwBoxV1Controller extends BaseController { record.setUpdateTime(new Date()); record.setRegisterTime(new Date()); record.setLastOnlineTime(new Date()); + record.setComKey(Utility.generate32UUID()); record.setRegisterStatus(EnumBoxRegisterStatus.REGISTERED.getCode()); kwBoxService.saveOrUpdate(record); Map data = new HashMap<>(); @@ -98,7 +104,20 @@ public class KwBoxV1Controller extends BaseController { } - private ResultData cmdLogin(String imei, String ccid, Date deviceTime, Map paramMap) + private boolean checkSign(KwBox kwBox, Map paramMap, String sign) { + HmacUtils hmacUtils = new HmacUtils(HmacAlgorithms.HMAC_SHA_1, kwBox.getComKey()); + String content = JSONObject.toJSON(paramMap).toString(); + String signCom = hmacUtils.hmacHex(content); + + boolean res = signCom.equalsIgnoreCase(sign); + + if (!res) { + logger.warn("SIGN check failed." + "content:"+content +"\n" + "signCom:" + signCom); + } + return res; + } + + private ResultData cmdLogin(String imei, String ccid, Date deviceTime, Map paramMap, String sign) { KwBox kwBox = kwBoxService.findByImei(imei); @@ -108,6 +127,9 @@ public class KwBoxV1Controller extends BaseController { if (!kwBox.getRegisterStatus().equals(EnumBoxRegisterStatus.REGISTERED.getCode())) return new ResultData(ErrorCode.DEVICE_NOT_FOUND); + if (!checkSign(kwBox, paramMap, sign)) + return new ResultData(ErrorCode.DEVICE_SIGN_INVALID); + saveCmd(kwBox.getTenantId(),KwBoxService.CMD_LOGIN,imei,ccid,deviceTime,paramMap); KwBox record = new KwBox(); @@ -124,7 +146,7 @@ public class KwBoxV1Controller extends BaseController { - private ResultData cmdHb(String imei, String ccid, Date deviceTime, Map paramMap) + private ResultData cmdHb(String imei, String ccid, Date deviceTime, Map paramMap, String sign) { KwBox kwBox = kwBoxService.findByImei(imei); if (kwBox == null) @@ -133,6 +155,9 @@ public class KwBoxV1Controller extends BaseController { if (!kwBox.getRegisterStatus().equals(EnumBoxRegisterStatus.REGISTERED.getCode())) return new ResultData(ErrorCode.DEVICE_NOT_FOUND); + if (!checkSign(kwBox, paramMap, sign)) + return new ResultData(ErrorCode.DEVICE_SIGN_INVALID); + saveCmd(kwBox.getTenantId(),KwBoxService.CMD_HEARTBEAT,imei,ccid,deviceTime,paramMap); KwBox record = new KwBox(); @@ -178,7 +203,8 @@ public class KwBoxV1Controller extends BaseController { @ApiOperation("开物盒子V1") @PostMapping("command") - public Result command(@RequestBody Map paramMap) { + public Result command(@RequestBody Map paramMap,@RequestParam String sign) { + String cmd = (String)paramMap.get(KwBoxService.PREFIX_CMD); if (StringUtil.isNullOrEmpty(cmd)) diff --git a/mallinkService/src/main/java/com/iformall/common/ErrorCode.java b/mallinkService/src/main/java/com/iformall/common/ErrorCode.java index 92f62bf62..afa20a878 100644 --- a/mallinkService/src/main/java/com/iformall/common/ErrorCode.java +++ b/mallinkService/src/main/java/com/iformall/common/ErrorCode.java @@ -409,6 +409,7 @@ public enum ErrorCode{ DEVICE_QRCODE_GET_FAILED(26002, "微信二维码生成失败,请重试"), DEVICE_REACHED_MAX_NUMBER(26003, "设备已经达到最大数量"), DEVICE_HAS_BEEN_BOUND(26004, "设备已经绑定到其他商户"), + DEVICE_SIGN_INVALID(26005, "设备签名无效"), /** * 消息组件 */