// 校验MAC private boolean checkMac(BusinessMessage bm) throws Exception { // 查询是否需要校验MAC ResourceBundle rb = null; try { rb = ResourceBundle.getBundle("conf.checkFlag"); bm.setMacFlag(Boolean.valueOf(rb.getString(bm.getChanelType() + "checkMacFlag"))); // WEBMessageHead fixMsgHeadData = (WEBMessageHead)bm.getFixMsgHeadData(); WEBMessageHead webMsgHeadData = (WEBMessageHead) bm.getWebMsgHeadData(); if ("000010".equals(bm.getTranCode()) && "7".equals(webMsgHeadData.getHandleType())) { bm.setMacFlag(false); } } catch (Exception e) { logger.error("取mac校验标志错!", e); // 默认为true bm.setMacFlag(true); } logger.info("mac校验标志:[{}],交易码:[{}]!", bm.isMacFlag(), bm.getTranCode()); if (bm.isMacFlag() == false || "000903".equals(bm.getTranCode())) { return true; } // 无论是否校验MAC,都取出MAB // 从报文头(除长度位字段)+报文体(除MAC字段) // (MAB),采用ECB算法,加密结果为64位的MAC。 byte[] macData = getMacData(); bm.setMacData(macData); // MAC String fieldName = "D_EPOS_MAC"; int length = 0; String macstr = null; try { length = fieldsConfig.getFieldAsciiLength(fieldName); macstr = FieldUtils.getFixedLengthAsciiField(fieldName, buffer, offset, length, fieldsConfig); offset += length; } catch (Exception e) { e.printStackTrace(); throw new PacketOperationException("mac获取出错"); } if (null == macstr || macstr.length() != 16) { logger.error("获取MAC错误!"); return false; } // String macstr = buffer.substring(buffer.length()-16); byte[] mac = ConvertUtils.str2Bcd(macstr); // (byte[])fieldValues.get("D_EPOS_MAC"); bm.setMac(mac); byte[] origMac = bm.getMac(); if (origMac == null) { throw new PacketOperationException("上传mac值为空!"); } // logger.info("mab:[{}]", new String(macData)); // logger.info("mac:[{}]", ConvertUtils.bytes2HexStr(origMac)); logger.info("开始进行MAC校验"); // POS不上送终端号,使用商户号作为密钥管理号 boolean result = encryptionService.checkMAC(origMac, macData, bm.getShopCode()); if (result) logger.info("MAC校验成功!"); else logger.info("MAC校验失败!"); return result; }