为什么 openGym 放弃密码:WebAuthn Passkey 登录原理与安全设计解析
为什么 openGym 放弃密码WebAuthn Passkey 登录原理与安全设计解析【免费下载链接】openGymhttps://github.com/DuarteSantos8/openGym项目地址: https://gitcode.com/gh_mirrors/ope/openGymopenGym 是一个自托管的健身房与体重追踪工具它彻底放弃了传统密码改用 WebAuthn Passkey生物识别密钥登录你用 Face ID 或指纹就能解锁自己的训练数据服务器上不存任何密码。本文面向新手用大白话讲清这套 Passkey 登录的工作原理以及它背后的 6 个关键安全设计帮你理解免密登录为什么反而更稳。1. 为什么一个自托管健身应用不适合用密码大部分健身 App 会把账号密码存在别人的服务器上数据也跟着一起被绑架。而 openGym 的设计哲学是数据放在你自己的机器上登录方式不能成为短板。密码方案对自托管场景尤其不友好密码会被复用——你不太可能为家里这台健身 App 专门想一个新密码大概率复用别站的弱密码泄露面大——一旦./data目录里的密码哈希被拖库用户还得改密码、收验证邮件体验差——手机上每次登录都要敲键盘和举起手机刷个脸就进的直觉相去甚远。openGym 的登录页只留下两个按钮「用 Passkey 登录」和「创建新档案」见 Login.jsx甚至给不支持 Passkey 的浏览器也留了「免账号继续」的本地模式兜底。2. 什么是 Passkey一句话版原理Passkey 基于WebAuthn标准核心是一条公钥-私钥配对角色存在哪作用私钥你的手机安全芯片 / 密码管理器iCloud 钥匙串、Google 密码管理器等对每次登录挑战做签名永远不离开设备公钥服务器db.json里的creds列表用来验证签名是否有效登录时服务器发来一段一次性的考题challenge你的设备用私钥作答签名服务器拿公钥验答案。因为私钥从不上网所以没有可被窃听、可被拖库的东西——这也是 openGym 在 README 里强调的Passkey 私钥永远不碰服务器。 顺带一提openGym 的独立 Android 应用无服务器版连登录这一步都没有数据直接存在手机里见 docs/MOBILE.md。3. 一次 Passkey 登录的完整流程前端逻辑集中在 api.js整个握手只有 4 步请求登录选项浏览器调用POST /api/login/options服务器生成一次性 challenge 并返回设备签名浏览器弹出系统级认证框Face ID / 指纹安全硬件用私钥对 challenge 签名提交凭证前端把签名结果clientDataJSONsignature等发回POST /api/login/verify验证发 Cookie服务器验签通过更新签名计数器下发一个签过名的会话 Cookie登录完成。服务端对应的注册 / 登录路由在 server.js实现只依赖一个库simplewebauthn/server没有引入任何框架。4. 安全设计逐条拆解4.1 服务器只存公钥密码零存储注册成功后服务器落盘的只是公钥、签名计数器和传输方式见 server.js。数据文件 db.json 里翻遍也找不到任何秘密——这就是放弃密码敢说的底气。4.2 Challenge 一次性且限时防重放攻击每个 challenge 存内存 Map 中5 分钟过期且takeChallenge取出即删除server.js。有人截获你某次登录的签名报文再重发对不起考题已被用过并销毁验证直接失败。4.3 签名 Cookie 版本号支持全设备登出登录后服务器下发的不是随机 token而是用 HMAC-SHA256 签名的 Cookieserver.js载荷格式是用户ID:过期时间:版本号服务端用timingSafeEqual做恒定时间比对杜绝时序侧信道点一次「在所有设备登出」POST /api/logout/all该用户的版本号sv加 1server.js之前签发过的所有 Cookie 瞬间全部失效——手机丢了也不怕用 Passkey 刷脸即可立即重新登录无需改任何密码。4.4 会话有效期取 90 天便利与风控的平衡默认SESSION_DAYS90server.js每周练几次的人可以一次登录永久有效但就算 Cookie 被盗攻击窗口也被压在 90 天内。Cookie 同时带HttpOnly、SameSiteLaxHTTPS 下再加Secure基本封死了 XSS 偷 Cookie 和跨站提交的常见路子。4.5 计数器防凭证克隆每次登录验证后服务器会把该凭证的签名计数器更新为最新值server.js。如果攻击者偷偷复制了你的凭证cloning两边的计数器会打架验证时即可发现异常。4.6 邀请码把注册入口也设计成安全件自托管实例可开启INVITE_ONLY模式SELF_HOSTING.md。注意邀请码的生成方式16 位十六进制64 位随机数而且在发选项和验证成功两个时点各校验一次再核销server.js——因为应用本身不做限流所以代码本身必须不值得被猜这是很典型的小团队安全思维。5. 两个新手最容易踩的坑现象原因与解法手机上死活弹不出 Passkey 框Passkey 要求HTTPS仅http://localhost例外局域网 IP HTTP 不行。给自己的实例配一个 HTTPS 域名即可详见 docs/SELF_HOSTING.md 第 3 节登录提示 verification failed.env里的RP_ID/ORIGIN和浏览器地址栏对不上。Passkey 绑定的是精确主机名改域名后旧 Passkey 也会作废选域名请在用户注册之前想清楚一句话记忆Passkey 认域名、认 HTTPS不认 IP。6. 写在最后openGym 的登录方案可以浓缩成三句话 私钥永远在设备里服务器只有公钥密码泄露无从谈起️ 一次性 challenge 签名 Cookie 版本号 计数器重放、盗 Cookie、凭证克隆三条攻击线全部设防⚡ 对用户的代价只是一次刷脸换来的是 90 天免登录和一键全设备登出。这套实现总共只有一个后端依赖、约 550 行无框架 Node 代码api/server.js如果你想给自己的自托管项目加免密登录它是一份非常值得参考的轻量范本。部署配置入口是 docker-compose.yml完整配置项见 SELF_HOSTING.md。【免费下载链接】openGymhttps://github.com/DuarteSantos8/openGym项目地址: https://gitcode.com/gh_mirrors/ope/openGym创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

MemoryAnalyzer 1.6.1实战:从堆转储到Java OOM根因定位

MemoryAnalyzer 1.6.1实战:从堆转储到Java OOM根因定位

简介:MemoryAnalyzer 1.6.1 的 Windows 版压缩包(2016 年 11 月 25 日构建)定位清晰,是面向 Java 开发者和运维人员的内存分析工具,用于读取堆转储文件,定位内存泄漏与对象异常占用。它由 Eclipse 基金会维…

2026/10/9 17:48:08 阅读更多 →
从合同审查到法律研究:智合AI等五款法律AI的场景对比

从合同审查到法律研究:智合AI等五款法律AI的场景对比

选法律AI,最怕的不是没得选,而是选错了方向。有人冲着名气下单,结果天天要用的场景里表现平平;有人图省事用免费版,碰上复杂案子又抓瞎。其实律师的日常就那几件事:查案例、审合同、写文书、做研究。把这几…

2026/10/9 17:48:08 阅读更多 →
模型推理服务平台是什么?AI落地的核心关键枢纽

模型推理服务平台是什么?AI落地的核心关键枢纽

很多人以为大模型的核心难点只在训练环节,其实真正决定AI能否落地商用、赋能业务的,是模型推理服务。模型训练是让算法学会能力,而推理服务是把训练好的模型转化为可调用、可复用、可服务业务的真实能力,是打通AI技术与产业应用的…

2026/10/9 17:48:07 阅读更多 →

最新新闻

极简即终极:用 TaoToken 统一 Key 重构 LLM 编码代理的终端 CLI 架构

极简即终极:用 TaoToken 统一 Key 重构 LLM 编码代理的终端 CLI 架构

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 18:29:21 阅读更多 →
从原理到实战:最简单的transformer教程二:全部注意力机制

从原理到实战:最简单的transformer教程二:全部注意力机制

自注意力机制(单头) 主要做的事情 1、计算 X 之间的关联程度 2、关联程度提取 X 的有用信息。 3、输出包含不同注意力分配的信息。 直接理解注意力权重(α′)只代表“看哪里、看多少”,它本身没有携带任何语义信息。我…

2026/10/9 18:29:16 阅读更多 →
边界值测试实战:从踩坑案例到完整方法论与自动化实践

边界值测试实战:从踩坑案例到完整方法论与自动化实践

1. 边界值测试到底在测什么1.1 从一个真实踩坑案例说起刚入行那会儿,我接手过一个用户注册模块的测试任务。需求文档写得很清楚:用户名长度6到20个字符。当时我年轻气盛,随手输了几个“正常”的用户名——zhangsan、lisi2024、wangwu123——全…

2026/10/9 18:29:07 阅读更多 →
测试数据生成全攻略:从Faker到AI辅助的6款工具与实操指南

测试数据生成全攻略:从Faker到AI辅助的6款工具与实操指南

1. 测试数据生成这件事,为什么值得单独拎出来聊做开发、做测试、做数据相关工作的朋友,大概都经历过这样的场景:功能写完了,单元测试也跑了,但一到集成测试或者演示环节就卡壳——数据库里空空如也,或者只有…

2026/10/9 18:29:02 阅读更多 →
CentOS 7上安装GreatSQL 8.0.32:从环境配置到SQL查询实验全攻略

CentOS 7上安装GreatSQL 8.0.32:从环境配置到SQL查询实验全攻略

简介:这是一份郑州大学计算机与人工智能学院《数据库系统原理》课程的实验报告,面向郑大计算机类专业学生,可作为数据库实验课程学习与报告撰写的参考资料。资源为单个docx文档,大小3.69MB,已有507人学习下载。内容从实…

2026/10/9 18:28:43 阅读更多 →
YOLO数据集标注格式详解与小样本训练实战

YOLO数据集标注格式详解与小样本训练实战

简介:本资源是一套专为YOLO系列目标检测算法(含YOLOv5/v7/v8/v9/v10/v11)定制的轻量级行人与车辆双类别训练数据集,面向计算机视觉初学者、算法工程师及课程实验开发者,解决小规模场景下快速验证模型结构、调试标签格式…

2026/10/9 18:27:22 阅读更多 →

日新闻

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API这个话题,隔三差五就会在群里被翻出来讨论一次。上周还有个同事线上处理一个订单超时问题,排查到最后发现是ZonedDateTime序列化后时区丢了,用户在下单当天晚上看到的时间整整差了8个小时。这类问题几乎每个做Java开发的人都遇到过…

2026/10/9 0:00:49 阅读更多 →
EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

前几个月我手头有好几台机器需要互相访问:办公室台式机、家里 NAS、还有一台云主机。如果只是偶尔传个文件倒还好,问题是工作场景经常要在几处环境之间来回切换,每次都先登录跳板机再层层代理,实在折腾。我先后试过端口映射、自建…

2026/10/9 0:00:49 阅读更多 →
AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent 这个词在过去一年里被反复提及,但真正动手搭过一套能跑起来的 Agent 系统的人都知道,从"知道它是什么"到"让它稳定干活"之间隔着一整套工程决策。我前后参与过几个 Agent 项目的落地,从最初用现成框架拼装&…

2026/10/9 0:01:50 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:32 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:40 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 10:11:06 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 21:13:17 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 6:17:20 阅读更多 →