2026/1/12 12:20:28
网站建设
项目流程
三亚市建设局官方网站,网页设计师资格证查询官网,免费 wordpress企业主题,wordpress 会话过期目录
一、核验核心目标与维度
1. 核心目标
2. 核验维度
二、核验技术方案
1. 前置准备
2. 数据库扩展设计
#xff08;1#xff09;用户签名特征表#xff08;user_sign_feature#xff09;
3. 核心核验流程#xff08;四层校验#xff09;
流程总览
#xff…目录一、核验核心目标与维度1. 核心目标2. 核验维度二、核验技术方案1. 前置准备2. 数据库扩展设计1用户签名特征表user_sign_feature3. 核心核验流程四层校验流程总览1第一层设备源校验快速拦截非法设备2第二层数据合法性校验拦截伪造数据3第三层摘要防篡改校验核心防篡改4第四层笔迹特征比对防代签4. 核验入口整合核心 Service5. 核验接口Controller三、汉王 ESP560 专属适配要点1. 特征提取适配2. 离线核验支持3. 阈值配置化四、测试与异常处理1. 核验测试用例2. 异常处理五、可视化与审计1. 核验结果展示2. 核验日志审计六、核心扩展1. 批量核验2. 司法级核验笔迹核验是考核签名项目的核心风控环节针对汉王 ESP560 的 2048 级压感特性需实现「数据合法性校验→摘要防篡改→笔迹特征比对→设备源校验」四层核验逻辑确保签名为本人真实操作、数据未被篡改。以下是完整的笔迹核验实施方案一、核验核心目标与维度1. 核心目标防篡改校验签名原始数据坐标 / 压力 / 时间戳是否被修改防代签对比签名笔迹特征压感变化、书写轨迹与历史数据一致性防伪造校验数据是否来自合法的汉王 ESP560 设备。2. 核验维度核验维度核验内容核心依据数据合法性压感值范围0-2048、坐标范围0-800/0-480、时间戳连续性ESP560 硬件参数2048 级压感、800×480 分辨率摘要防篡改对比当前签名数据 SM3 摘要与存储的原始摘要哈希不可逆特性数据篡改则摘要不一致笔迹特征比对书写速度、压感变化趋势、笔画拐点、书写轨迹相似度汉王 ESP560 SDK 笔迹特征提取接口设备源校验校验签名设备 ID 是否在白名单内、设备驱动版本是否合规设备注册台账、汉王官方驱动版本二、核验技术方案1. 前置准备汉王 SDK 集成引入汉王 ESP560 的笔迹特征比对 SDKhanvon-feature-sdk.jar支持提取笔迹特征值、计算相似度历史特征库在 MySQL 中建立user_sign_feature表存储员工历史签名的特征值加密存储设备白名单在 Redis 中维护 ESP560 设备 ID 白名单hanvon:esp560:whitelist仅允许合法设备签名。2. 数据库扩展设计1用户签名特征表user_sign_featurejava运行Entity Table(name user_sign_feature) public class UserSignFeature { Id GeneratedValue(strategy GenerationType.IDENTITY) private Long id; private Long userId; // 员工ID private String featureValue; // 笔迹特征值SM4加密 private String deviceId; // 签名设备ID private LocalDateTime createTime; // 特征录入时间 // getter/setter }3. 核心核验流程四层校验流程总览plaintext前端提交签名数据 → 第一层设备源校验 → 第二层数据合法性校验 → 第三层摘要防篡改校验 → 第四层笔迹特征比对 → 返回核验结果1第一层设备源校验快速拦截非法设备java运行/** * 设备源校验校验设备ID是否在白名单、驱动版本是否合规 * param deviceId ESP560设备ID * param driverVersion 设备驱动版本 * return 校验结果 */ public boolean checkDeviceValid(String deviceId, String driverVersion) { // 1. 从Redis获取设备白名单 SetString whiteList redisTemplate.opsForSet().members(hanvon:esp560:whitelist); if (whiteList null || !whiteList.contains(deviceId)) { log.error(设备ID{}不在白名单内, deviceId); return false; } // 2. 校验驱动版本汉王ESP560最低驱动版本V2.1.0 if (VersionUtil.compare(driverVersion, V2.1.0) 0) { log.error(设备{}驱动版本过低当前{}要求≥V2.1.0, deviceId, driverVersion); return false; } return true; }2第二层数据合法性校验拦截伪造数据java运行/** * 数据合法性校验校验压感、坐标、时间戳 * param signRawData 签名原始数据JSON字符串 * return 校验结果 */ public boolean checkDataValid(String signRawData) { try { JSONObject signObj JSONUtil.parseObj(signRawData); JSONArray points signObj.getJSONArray(points); if (points.isEmpty()) { log.error(签名数据为空); return false; } // 记录上一个点的时间戳校验连续性 long lastTime 0; for (int i 0; i points.size(); i) { JSONObject point points.getJSONObject(i); // 1. 压感值校验0-2048 int pressure point.getInt(pressure); if (pressure 0 || pressure 2048) { log.error(压感值{}超出ESP560范围0-2048, pressure); return false; } // 2. 坐标校验800×480 int x point.getInt(x); int y point.getInt(y); if (x 0 || x 800 || y 0 || y 480) { log.error(坐标({},{})超出ESP560范围800×480, x, y); return false; } // 3. 时间戳校验递增、无跳变 long time point.getLong(time); if (i 0 time lastTime) { log.error(时间戳不连续上一个{}当前{}, lastTime, time); return false; } // 4. 时间间隔校验书写间隔≤1000ms防止伪造 if (i 0 (time - lastTime) 1000) { log.error(书写间隔过长{}ms疑似伪造数据, time - lastTime); return false; } lastTime time; } return true; } catch (Exception e) { log.error(数据合法性校验失败, e); return false; } }3第三层摘要防篡改校验核心防篡改java运行/** * 摘要防篡改校验对比SM3摘要 * param examNo 考核单号 * param signRawData 待核验签名数据 * return 校验结果 */ public boolean checkHashValid(String examNo, String signRawData) { // 1. 获取存储的原始摘要 String storedHash redisTemplate.opsForValue().get(sign:hash: examNo); if (storedHash null) { ExamSignRecord record signRecordRepository.findByExamNo(examNo) .orElseThrow(() - new RuntimeException(签名记录不存在)); storedHash record.getSignHash(); // 缓存摘要提升后续核验效率 redisTemplate.opsForValue().set(sign:hash: examNo, storedHash, 7, TimeUnit.DAYS); } // 2. 计算当前数据的SM3摘要 String currentHash smCryptoUtil.sm3Digest(signRawData.getBytes(StandardCharsets.UTF_8)); // 3. 对比摘要 boolean valid storedHash.equals(currentHash); if (!valid) { log.error(摘要不一致存储{}当前{}, storedHash, currentHash); } return valid; }4第四层笔迹特征比对防代签java运行/** * 笔迹特征比对提取特征值对比与历史签名的相似度 * param userId 员工ID * param signRawData 待核验签名数据 * return 校验结果相似度≥80%则通过 */ public boolean checkFeatureMatch(Long userId, String signRawData) { // 1. 获取用户历史签名特征值 ListUserSignFeature historyFeatures userSignFeatureRepository.findByUserId(userId); if (historyFeatures.isEmpty()) { log.warn(用户{}无历史签名特征跳过特征比对, userId); return true; // 首次签名跳过仅记录特征 } // 2. 提取当前签名的特征值调用汉王SDK HanvonFeatureExtractor extractor new HanvonFeatureExtractor(); String currentFeature extractor.extract(signRawData); // 提取特征值 if (StrUtil.isBlank(currentFeature)) { log.error(提取当前签名特征失败); return false; } // 3. 对比与历史特征的相似度调用汉王SDK HanvonFeatureComparator comparator new HanvonFeatureComparator(); boolean match false; for (UserSignFeature history : historyFeatures) { // 解密历史特征值 String historyFeature new String(smCryptoUtil.sm4Decrypt(history.getFeatureValue()), StandardCharsets.UTF_8); // 计算相似度0-100 int similarity comparator.compare(currentFeature, historyFeature); log.info(用户{}笔迹相似度{}%, userId, similarity); if (similarity 80) { // 阈值可配置 match true; break; } } // 4. 首次核验通过后更新最新特征滚动更新 if (match) { UserSignFeature newFeature new UserSignFeature(); newFeature.setUserId(userId); newFeature.setFeatureValue(smCryptoUtil.sm4Encrypt(currentFeature.getBytes(StandardCharsets.UTF_8))); newFeature.setDeviceId(extractDeviceId(signRawData)); newFeature.setCreateTime(LocalDateTime.now()); userSignFeatureRepository.save(newFeature); } return match; }4. 核验入口整合核心 Servicejava运行Service public class SignVerifyService { Autowired private RedisTemplateString, String redisTemplate; Autowired private SmCryptoUtil smCryptoUtil; Autowired private ExamSignRecordRepository signRecordRepository; Autowired private UserSignFeatureRepository userSignFeatureRepository; /** * 全流程笔迹核验 * param examNo 考核单号 * param userId 员工ID * param signRawData 待核验签名数据 * param deviceId 设备ID * param driverVersion 驱动版本 * return 核验结果失败原因 */ public VerifyResult verifySign(String examNo, Long userId, String signRawData, String deviceId, String driverVersion) { VerifyResult result new VerifyResult(); // 第一层设备源校验 if (!checkDeviceValid(deviceId, driverVersion)) { result.setSuccess(false); result.setReason(非法设备/驱动版本过低); return result; } // 第二层数据合法性校验 if (!checkDataValid(signRawData)) { result.setSuccess(false); result.setReason(签名数据非法压感/坐标/时间戳异常); return result; } // 第三层摘要防篡改校验 if (!checkHashValid(examNo, signRawData)) { result.setSuccess(false); result.setReason(签名数据已篡改摘要不一致); return result; } // 第四层笔迹特征比对 if (!checkFeatureMatch(userId, signRawData)) { result.setSuccess(false); result.setReason(笔迹特征不匹配疑似代签); return result; } // 所有校验通过 result.setSuccess(true); result.setReason(核验通过); // 更新验签状态 signRecordRepository.updateVerifyStatus(examNo, 核验通过); return result; } // 内部校验方法前文已定义checkDeviceValid/checkDataValid/checkHashValid/checkFeatureMatch } // 核验结果封装 Data public class VerifyResult { private boolean success; private String reason; private int similarity; // 笔迹相似度可选 }5. 核验接口Controllerjava运行RestController RequestMapping(/api/exam/sign/verify) public class SignVerifyController { Autowired private SignVerifyService signVerifyService; PostMapping(/hanvon) public ResultVerifyResult verifyHanvonSign( RequestParam String examNo, RequestParam Long userId, RequestBody String signRawData, RequestParam String deviceId, RequestParam String driverVersion) { VerifyResult result signVerifyService.verifySign(examNo, userId, signRawData, deviceId, driverVersion); return Result.success(result); } }三、汉王 ESP560 专属适配要点1. 特征提取适配汉王 ESP560 的 2048 级压感是核心特征提取特征时需启用「压感权重优先」模式java运行extractor.setConfig(pressureWeight, 0.7); // 压感权重70%坐标权重30%适配 ESP560 的 800×480 分辨率特征提取时需归一化坐标避免不同设备分辨率影响。2. 离线核验支持若 ESP560 设备离线可先缓存核验请求联网后自动触发核验离线状态下仅执行前三层校验设备 / 数据 / 摘要第四层特征比对待联网后完成。3. 阈值配置化将笔迹相似度阈值80%、时间间隔阈值1000ms配置在application.yml支持动态调整yamlhanvon: sign: similarity-threshold: 80 time-interval-threshold: 1000四、测试与异常处理1. 核验测试用例测试场景测试步骤预期结果合法签名核验本人在 ESP560 签名提交核验四层校验通过返回 “核验通过”篡改压感数据修改签名数据中的压感值如改为 3000提交核验第二层校验失败原因 “压感值超出范围”篡改坐标数据修改坐标为 900超出 800提交核验第二层校验失败原因 “坐标超出范围”代签核验他人模仿签名提交核验第四层校验失败原因 “笔迹特征不匹配”非法设备签名使用非白名单 ESP560 设备签名提交核验第一层校验失败原因 “非法设备”2. 异常处理特征提取失败记录日志降级为仅前三层校验人工复核历史特征为空首次签名跳过特征比对仅记录特征值二次签名开始校验设备白名单更新提供后台接口支持动态添加 / 删除设备 ID无需重启服务。五、可视化与审计1. 核验结果展示前端展示核验结果通过 / 失败、失败原因、笔迹相似度支持查看签名轨迹对比图当前签名 vs 历史签名。2. 核验日志审计记录每一次核验的「考核单号、用户 ID、设备 ID、核验结果、失败原因、时间」支持按时间 / 用户 / 设备筛选核验日志导出审计报表。六、核心扩展1. 批量核验支持按考核批次批量核验签名生成核验报告通过率、失败原因分布批量核验采用异步任务Async避免阻塞主线程。2. 司法级核验对接汉王司法级笔迹鉴定接口核验结果可生成司法鉴定报告签名数据同步至区块链存证平台核验结果上链不可篡改。该方案基于汉王 ESP560 的硬件特性实现了从 “设备源头” 到 “笔迹特征” 的全维度核验既满足考核场景的风控需求又符合电子签名法的合规要求。可直接集成到 SpringBoot 考核签名项目中如需调整核验维度如增加人脸核验联动可按需扩展。