Chirag1302/upi_without_internet

GitHub: Chirag1302/upi_without_internet

一个基于Spring Boot的离线UPI支付模拟系统,通过模拟蓝牙网格网络路由加密支付包,并在桥接设备联网后实现幂等结算与重放保护。

Stars: 0 | Forks: 0

# UPI 离线网格 一个Spring Boot后端,模拟通过网格网络路由的**离线UPI支付**。 本项目演示了加密的支付数据包如何在没有互联网连接的情况下,通过附近的设备传输,并在桥接设备重新获得互联网接入后进行结算。 该系统聚焦于三个核心分布式系统问题: * 通过不可信设备进行安全的端到端加密支付 * 在重复数据包投递情况下的幂等结算 * 重放与篡改防护 # 演示场景 假设有一个没有互联网的地下室。 1. Alice 向 Bob 发送 ₹500。 2. 支付在本地加密。 3. 附近的手机通过模拟的蓝牙网格中继加密数据包。 4. 某个桥接设备稍后重新连接到互联网。 5. 数据包被上传到后端。 6. 后端解密、验证、去重,并确保支付仅结算一次。 本仓库包含: * Spring Boot 后端 * 加密管道 * 网格网络模拟器 * 交易结算引擎 * 交互式仪表盘 * 并发与篡改测试 # 特性 ## 安全混合加密 使用: * RSA-OAEP 进行密钥交换 * AES-256-GCM 进行负载加密和认证 中间网格设备无法: * 读取交易数据 * 修改数据包 * 伪造有效的密文 ## 幂等结算 重复上传被安全拒绝,使用: * SHA-256 密文哈希 * 原子 `putIfAbsent()` 去重 * 数据库级别的唯一约束 即使多个桥接节点同时上传同一个数据包,结算也仅发生一次。 ## 重放保护 每个支付包含: * 唯一的 nonce * 时间戳验证 旧数据包或重放的数据包会被自动拒绝。 # 技术栈 | 层 | 技术 | |---------|-------------------------| | 后端 | Spring Boot 3 | | 语言 | Java 17 | | 数据库 | H2(内存) | | ORM | Spring Data JPA | | 构建工具 | Maven Wrapper | | 加密 | RSA-OAEP + AES-GCM | | 并发 | ConcurrentHashMap + 乐观锁| | 前端 | Thymeleaf 仪表盘 | # 项目架构 ``` Sender Phone (Offline) │ ▼ Encrypt Payment Packet │ ▼ Mesh Network Gossip │ ▼ Bridge Device Gets Internet │ ▼ POST /api/bridge/ingest │ ▼ Hash → Deduplicate → Decrypt → Validate → Settle ``` # 运行项目 ## 前置条件 * JDK 17+ 验证安装: ``` java -version ``` ## 在 Windows 上运行 ``` .\mvnw.cmd spring-boot:run ``` ## 在 Mac/Linux 上运行 ``` ./mvnw spring-boot:run ``` # 打开仪表盘 启动后: ``` http://localhost:8080 ``` 仪表盘允许你: * 向网格中注入加密支付 * 运行八卦轮次 * 通过桥接节点上传数据包 * 查看余额和交易结算 # 可用 API | 方法 | 端点 | 描述 | |------|------------------------|-----------------------------| | GET | `/` | 仪表盘 UI | | GET | `/api/accounts` | 账户余额 | | GET | `/api/transactions` | 交易账本 | | GET | `/api/mesh/state` | 网格设备状态 | | POST | `/api/demo/send` | 注入加密支付 | | POST | `/api/mesh/gossip` | 运行网格八卦轮次 | | POST | `/api/mesh/flush` | 从桥接设备上传数据包 | | POST | `/api/bridge/ingest` | 生产环境摄取端点 | # 重要组件 ## 加密 ### HybridCryptoService 实现: * RSA 密钥包装 * AES-GCM 加密/解密 * 密文哈希 * 篡改检测 ## 网格模拟器 ### MeshSimulatorService 模拟: * 虚拟手机 * 数据包八卦传播 * 基于 TTL 的数据包路由 * 具有互联网访问的桥接节点 ## 结算引擎 ### SettlementService 负责: * 原子借/贷操作 * 交易持久化 * 乐观锁 * 账本一致性 ## 幂等层 ### Idempotency 使用以下方式防止重复结算: ``` seen.putIfAbsent(packetHash, now) ``` 只有第一个声明数据包的线程才能进入结算环节。 # 测试 运行所有测试: ``` .\mvnw.cmd test ``` 关键测试用例: * 加密/解密往返 * 拒绝被篡改的密文 * 并发重复结算防护 并发测试模拟多个桥接节点同时上传同一个数据包。 # 文件夹结构 ``` src/main/java/com/demo/upimesh/ ├── config/ ├── controller/ ├── crypto/ ├── model/ ├── service/ └── UpiMeshApplication.java ``` # 生产改进 本项目是演示/模拟环境。 对于生产级部署: | 演示 | 生产 | |------------------------|--------------------------| | H2 数据库 | PostgreSQL / MySQL | | ConcurrentHashMap | Redis SETNX | | 模拟网格 | BLE / Wi-Fi Direct | | 本地 RSA 密钥 | HSM / KMS | | 无认证 | 双向 TLS | | 内存账户 | 真实银行集成 | # 已知限制 * 离线支付无法保证发送方余额可用 * 结算前可能存在双重支付 * 在移动设备上实现真实的蓝牙网格网络较困难 * 这是延迟结算,并非真正的即时离线 UPI # 学习成果 本项目展示了以下领域的概念: * 分布式系统 * 应用密码学 * 并发控制 * 幂等 API 设计 * 事务处理 * 网格网络模拟 * Spring Boot 后端工程 # 截图 部署后在此处添加仪表盘截图。 # 作者 Chirag Chahar # 许可证 开放用于学习和教育目的。
标签:AES-256-GCM, Java 17, Mesh网络, Nonce, putIfAbsent, RSA-OAEP, SHA-256哈希, Spring Boot, UPI支付, Zenmap, 交互式仪表盘, 分布式系统, 区块链思维, 去重机制, 后端开发, 响应大小分析, 密码学, 幂等结算, 并发交易处理, 并发测试, 手动系统调用, 支付模拟, 支付系统, 数据完整性, 数据库唯一约束, 时间戳验证, 桥接节点, 混合加密, 离线传输, 离线支付, 端到端加密, 篡改防护, 网络安全, 蓝牙网络, 蓝队防御, 重放攻击防护, 隐私保护