# 社群与账户安全 2.5.0 本次同时更新 APP 和自建服务器。服务器地址继续由 `ServerSettings.BaseUrl` 硬编码,普通用户没有修改入口。管理员后台仍在 APP 内;服务器再次校验管理员权限。 ## 当前试用配置 按本次确认,使用 HTTP 试用、人工认证和人工内容审核。腾讯云短信的密钥、应用、签名与模板配置均留空;不会声称已经发送短信。购买链接为空,登录和账户页隐藏「获取卡密」按钮,卡密由管理员生成、复制或导出分发。 本次测试全部使用本机独立服务器、独立测试应用和虚构资料。HTTP 不加密,试用页有明确提示。客户端 `AllowPrivateHttpTrial` 和服务端 `PrivateHttpTrial` 当前均为 `true`。部署 HTTPS 后,将两者改为 `false`,更新硬编码地址并重新编译;私密接口在未允许试用的 HTTP 请求上返回 426。 ## 本机解锁与清除 「设置 → 密码 / 指纹解锁与数据清除」可自行开启或关闭。解锁密码独立于登录密码,按账户保存为带随机盐的 PBKDF2 校验值,使用系统安全存储。启用后,冷启动先解锁再打开经营数据库;窗口失去前台时立即锁定;进入后台时暂停业务、社群轮询及通话,并用锁定页遮盖内容。连续错误有递增等待时间。 Android 9 / API 28 及以上可使用设备已登记的生物识别。密钥保存在 Android Keystore,每次必须完成强生物识别授权,随后执行加密操作作为验证凭据。没有登记指纹、取消或验证失败时使用解锁密码。忘记本机解锁密码需联网验证登录密码;也可退出并切换账户。证照、密码确认及认证审核页限制系统截图和后台预览。 安装包声明 `USE_BIOMETRIC` 权限,并使用 [Android BiometricPrompt 的加密授权方式](https://developer.android.com/reference/android/hardware/biometrics/BiometricPrompt)。系统指纹模板由设备管理,APP 不获取或上传指纹数据。 「清除所有数据」先显示范围,再分别要求两次登录密码;服务器独立验证两次输入。清除范围: - 此设备当前账户的账目、经营记录、设置、记录照片、自动备份、发布草稿和账户缓存。 - 当前账户可见的服务器聊天历史及待确认的证照互换申请。 账号、授权、认证、举报和已发布帖子保留,其他账户的本机经营数据以及对方可见的聊天历史保留。用户另存到 APP 之外的导出文件需自行删除。服务器聊天按账户清除可见范围,不能删除对方已收到的副本。清除后没有本机回收站恢复入口;本机清除回执支持重新启动后继续完成,中止的旧数据库读写和备份任务不能重建旧记录。 ## 协议、认证和手机号 首次进入社群须主动勾选版本化用户协议。未勾选不能进入;拒绝可返回经营功能。后台修改正文会生成新版本,用户下次进入须重新同意。默认协议是待运营者完善的草稿,须补充主体、联系方式、实际隐私政策及运营规则。 已授权用户无需实名认证即可浏览。发布、评论、点赞、私聊、附件发送和通话须完成个人或企业认证并绑定手机号。普通账户和管理员发布均遵循认证门槛。 | 身份 | 必填资料 | 银行卡户名 | | --- | --- | --- | | 个人 | 姓名、身份证号、人像面照片、电话 | 自动等于姓名,不可修改;银行卡号、开户行和地址选填,填写银行卡时须同时填写开户行 | | 企业 | 企业名、法人姓名、法人身份证号、人像面照片、营业执照照片、电话、法人银行卡号及开户行 | 自动等于法人姓名,不可修改;地址选填 | 身份证国徽面可另附。格式和校验位检查只发现输入错误,不代表身份核验通过。管理员在「进入管理后台 → 社群认证、内容审核与举报 → 实名认证」查看原始申请和照片,核验证件、申请人及手机号后勾选两项确认,再通过或填写拒绝原因。重新提交撤销原认证写权限,版本检查避免审核旧资料。手机号不能重复绑定;当前人工核验通过后绑定为 `MANUAL`。个人显示蓝标;通过企业认证显示黄标,其他账户显示个人蓝标。 独立的 `IIdentityVerificationProvider` 和管理员 `POST /api/admin/safety/identities/{id}/provider-check` 为认证服务扩展点。当前实现 `ManualIdentityVerificationProvider` 不调用外部服务、不做人脸核验、不自动批准。接口结果只是辅助证据,最终仍须管理员人工决定。未来接入服务商时须另行实现其认证流程、配置和用户授权;此接口不读取经营数据库,也不经社群内容审核通道传输证件。 ### 腾讯云短信 配置只留在服务器环境,不放入 APK、源码库或日志: | 环境变量 | 内容 | | --- | --- | | `TENCENTCLOUD_SECRET_ID` / `TENCENTCLOUD_SECRET_KEY` | 腾讯云 API 凭据 | | `JDJ_SMS_APP_ID` | 短信应用的 SdkAppId | | `JDJ_SMS_SIGN` | 已审核的签名正文 | | `JDJ_SMS_TEMPLATE_ID` | 已审核的验证码模板 ID | | `JDJ_SMS_REGION` | 默认 `ap-guangzhou` | | `JDJ_SMS_TEMPLATE_MINUTES` | 模板有第二个有效期参数时设为 `true`,参数依次为验证码和 `5` | 实现使用 [腾讯云 SendSms 2021-01-11](https://cloud.tencent.com/document/product/382/55981) 和 [TC3 请求签名](https://cloud.tencent.com/document/api/213/30654)。号码格式为中国大陆 11 位手机号,出站转换成 `+86`。验证码有效 5 分钟、60 秒重发间隔、每天最多 5 次,最多 5 次验证尝试,使用后失效。供应商拒绝或发送失败不会产生可用验证码。已认证手机号变更须重新提交认证审核。 ## 内容审核与举报 普通用户的新帖子、评论和私信先等待审核;作者可查看待审核状态,对方或其他浏览者不能读取未通过内容及附件。通过后正常传播,拒绝后仍不传播。在默认人工模式下,已认证管理员的官方发布由其管理角色负责。旧公开帖子和评论在升级时进入人工复核;历史私信不会再次发送给外部审核服务。 举报入口在帖子详情和聊天页。文字说明与 1–5 张图片都必填,材料只给本人和管理员读取。后台可处理举报、拒绝举报,或单独封禁社群功能;封禁不会撤销卡密或停用经营账目。管理员账户列表可解除社群封禁。 未配置外部审核地址时完全使用人工审核。可在服务器配置 `JDJ_MODERATION_URL` 与可选的 `JDJ_MODERATION_TOKEN`,对接独立审核适配器。公网适配器须 HTTPS;开发环境允许回环 HTTP 测试。固定请求: ```json {"ticket":"123","kind":"POST","text":"待审核社群文字","media":[{"kind":"IMAGE","mimeType":"image/jpeg","bytesBase64":"社群附件字节的 Base64"}]} ``` 响应为 `{"ticket":"123","decision":"APPROVED","reason":""}`,结论可为 `APPROVED`、`REJECTED` 或 `REVIEW`。票号不匹配、失败、超时或无效响应均转人工复核。出站只包含该审核任务的社群文字及附件,不带账号标识、经营账目、私密认证照片或银行卡资料。用户自行写入帖子或私信的内容属于提交审核的社群内容。 ## 双方证照互换 聊天页「互换证照」先展示共享范围,由一方明确申请,另一方再次确认。确认前无资料卡;申请方不能替另一方确认。双方须仍处于可写社群状态,认证版本也须与申请一致。 确认后双方各收到姓名、电话、地址、企业名、银行卡号、开户行及证照照片。身份证号码不进入交换卡片。照片生成新的 JPEG,实际像素中写入「日期 + 时间 + 仅本次交易核验 其他无效」水印,原始照片不交给对方。可复制姓名/电话/地址组合,也可分别复制姓名、卡号、开户行。原始照片仅本人及审核管理员可读,交换照片仅双方可读,管理员无第三方读取交换卡片的权限。 认证、举报、证照互换保存在独立 `identity.db`;内容和资料照片使用 AES-GCM 加密,密钥位于 `private-vault.key`,照片位于 `private-vault/`。加密密钥须与数据一起备份,遗失不能重新生成替代密钥来解密旧数据。后台核验、原始资料访问和处理留有操作记录,日志不存证件号、银行卡号或照片内容。 ## 服务卡片与卡密 社群为「关注、同城、推荐、供需、服务、广场、私信」。服务按奢侈品鉴定、烟酒鉴定、车辆价值评估和其他服务筛选。支持自定义项目、固定或区间收费、计费单位、详细说明和照片;兜底回购默认「是」,可改为「否」。服务卡片可查看、联系作者、编辑、删除与刷新,发布后进入审核。 卡密生成可选永久、自定义天数或指定到期日期;兑换期限独立设置。永久授权不会被之后兑换的限期卡缩短。完整卡密仅生成时返回,复制与 CSV 分发继续支持。购买链接只由管理员配置为 HTTPS;留空时入口隐藏。链接购买只是跳转运营者页面,不表示 APP 已接入支付或会自动发卡。 ## 升级、备份与测试 停服并备份整个服务器数据目录,再同时更新服务器和 APK。保留 `accounts.db`、`identity.db`、存在的 WAL/SHM、`community-media/`、`private-vault/` 和 `private-vault.key`。服务器自动新增表和字段,不能用交付包的新空数据覆盖旧数据。Linux 水印需要可用的中文字体,可用 `JDJ_WATERMARK_FONT` 指定字体文件;默认查找 Noto Sans CJK,Windows 使用微软雅黑。 自动验证命令: ```powershell dotnet build src/JiDangJia.Server -c Release dotnet run --project tests/JiDangJia.Checks -c Release dotnet run --project tests/JiDangJia.AuthChecks -c Release dotnet run --project tests/JiDangJia.SafetyChecks -c Release node tools/check-community-safety.cjs node tools/check-moderation-boundary.cjs node tools/check-community-media.cjs ``` 模拟器先用 `tools/build-community-test.ps1` 构建并安装独立测试包 `com.xfestudio.jidangjia.authtest`,运行 `node tools/start-community-fixture.cjs` 保持本机 5188 服务器启动,再运行 `check-community-ui.cjs login` 和 `check-safety-ui.cjs` 的 `services`、`identity`、`observer`、`exchange`、`admin`、`lock-clear` 阶段。`lock-clear` 只清除该独立测试包中的虚构记录,不能替换为正式包名。 本次通过 142 项社群安全接口、37 项短信签名/验证码/数据清除与密钥恢复、11 项审核数据隔离、113 项双浏览器媒体和 59 项 Pixel 7 / API 36 原生界面检查。原生检查包含快速返回后的锁定、错误密码拒绝、双登录密码清除、账户之间的数据保留及未登记指纹时的密码回退。经营与备份 231 项、实际客户端登录卡密 60 项检查也通过。 结果见 `artifacts/verification/community-safety.json`、`safety-unit.json`、`moderation-boundary.json`、`safety-ui.json` 与 `community-media-checks.json`。Windows 独立服务器启动与空短信/购买配置已验证;最终 APK 的 v1/v2/v3 签名、版本、指纹权限和与 2.4.0 的升级签名一致性均通过,见 `published-server-2.5.0.json` 与 `release-2.5.0.json`。实际腾讯云短信发送、真实证件人工审核和已登记指纹的实体设备仍须用正式配置及有权使用的资料验收。