fix(device): 设备注册绑定接口添加 PoP 验签,照片下载改为设备端本地解密

This commit is contained in:
TongTongStudio
2026-08-24 21:32:22 +08:00
parent 417c4989f7
commit dbb75658a6
38 changed files with 2300 additions and 761 deletions

View File

@@ -1,7 +1,7 @@
-- ============================================================
-- 安全设备 Demo - 数据库初始化脚本
-- 库名: secure_device (与 application.properties 中配置一致)
-- 说明: 存储照片元数据、设备、用户、用户照片索引
-- 说明: 存储照片元数据、设备、用户
-- 密文本身落盘于 uploads/ 目录
-- 服务端永远不存明文照片和明文 DEK
-- ============================================================
@@ -46,23 +46,12 @@ CREATE TABLE IF NOT EXISTS `device` (
CREATE TABLE IF NOT EXISTS `app_user` (
`user_id` VARCHAR(64) NOT NULL COMMENT '用户 ID (PK)',
`phone` VARCHAR(32) DEFAULT NULL COMMENT '手机号(用于短信验证)',
`uk_encrypted_base64` TEXT DEFAULT NULL COMMENT '用户主密钥 UK (Base64)',
`password` VARCHAR(128) DEFAULT NULL COMMENT '登录密码 (Demo 明文,生产用 BCrypt)',
`uk_encrypted_base64` TEXT DEFAULT NULL COMMENT '用户主密钥 UK(经 SMK-AES-256-GCM 信封加密,格式 ivBase64:ciphertextBase64非明文',
`password` VARCHAR(128) DEFAULT NULL COMMENT '登录密码 (BCrypt 哈希60 字符,绝不明文)',
`phone_verified` VARCHAR(8) DEFAULT NULL COMMENT '手机号是否已验证',
PRIMARY KEY (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='用户与主密钥表';
-- 5. 用户-照片关联表(对应 UserPhoto 实体)
CREATE TABLE IF NOT EXISTS `user_photo` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '自增主键',
`user_id` VARCHAR(64) NOT NULL COMMENT '用户 ID',
`photo_id` VARCHAR(64) NOT NULL COMMENT '照片 ID',
`created_time` BIGINT DEFAULT NULL COMMENT '创建时间戳 (ms)',
PRIMARY KEY (`id`),
KEY `idx_user_photo_user` (`user_id`),
KEY `idx_user_photo_photo` (`photo_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='用户照片索引表';
-- ============================================================
-- 已有数据库迁移(仅当旧库的 device 表带 SN 唯一索引时手动执行)
-- 说明:早期版本 device.sn 建为 UNIQUE 索引,导致「恢复出厂重新注册」时
@@ -72,3 +61,25 @@ CREATE TABLE IF NOT EXISTS `user_photo` (
-- ============================================================
-- ALTER TABLE `device` DROP INDEX `idx_device_sn`;
-- ALTER TABLE `device` ADD INDEX `idx_device_sn` (`sn`);
-- ============================================================
-- 迁移P0-1 修复UK 明文落库 -> SMK 信封加密)
-- ============================================================
-- 列结构无需变更uk_encrypted_base64 本就是 TEXT
-- 已有旧数据(明文 UKBase64 且不含冒号)需重新用 SMK 包裹。
-- 纯 SQL 无法完成 AES-256-GCM(密钥来自环境变量 APP_MASTER_KEY)
-- 因此由应用侧一次性 Runner 完成:
--
-- 设置环境变量后启动应用一次:
-- export APP_MASTER_KEY=<Base64 的 32 字节>
-- export APP_RUN_MIGRATION=true
-- # 启动 Spring BootRunner 自动把明文 UK 重新包裹
-- # 成功后关闭unset APP_RUN_MIGRATION
--
-- 若数据库为演示数据、可整体重建,则无需迁移,直接:
-- TRUNCATE TABLE `app_user`;
-- TRUNCATE TABLE `encrypted_photo`;
-- TRUNCATE TABLE `device`;
-- 然后重新走注册流程即可(新账号 UK 默认即用 SMK 加密)。
-- 注:早期版本存在 user_photo 关联表(已废弃),照片归属统一由 encrypted_photo.user_id 承担。
-- ============================================================