安全边界
当前身份功能是安全 MVP,不代表服务已经完成公网生产加固。
密码
- 密码只保存 Argon2id PHC 格式散列,每条凭据使用独立随机 salt。
- 参数固定为
m=19456 KiB、t=2、p=1,符合当前项目采用的 OWASP 最低配置。 - 散列和校验通过 Tokio blocking task 执行,不阻塞异步运行时线程。
- 密码长度按 Unicode 字符计算,为 15–128;允许空格、符号和 Unicode。
- 用户不存在时仍执行一次 Argon2id 运算;不存在与密码错误返回相同响应。
如果以后修改参数,登录校验必须继续兼容已有 PHC 字符串,并设计登录后升级 散列的路径。
Session
- 浏览器只保存不透明 Session ID,数据位于 PostgreSQL。
- Cookie 名为
rustloom_session,设置HttpOnly、SameSite=Lax、Path=/, 不设置Domain。 - 登录和注册会轮换 Session ID,防止 Session fixation。
- 每台设备使用独立 Session,退出只删除当前设备记录。
- Session 闲置 12 小时过期;每次有效认证请求刷新活动时间。
- 无论是否活跃,Session 创建 7 天后绝对失效。
- 应用每小时删除一次已过期的数据库记录。
- Session 表只能由 SQLx migration 创建,代码禁止调用 Store 的
migrate()。
本地 HTTP 开发使用 SESSION_COOKIE_SECURE=false。生产环境在 HTTPS 下必须使用:
SESSION_COOKIE_SECURE=true
数据和错误
.env、生产连接串、Cookie 文件和数据库密码不得提交。- SQL 使用绑定参数,公开 Profile 模型不含
password_hash。 - 数据库、Session 与密码服务的底层错误只写入服务端标准错误流;客户端仅收到 稳定错误码。
- 服务未开放 CORS,身份 API 按同源浏览器应用设计。
尚未覆盖
首版明确不包含:
- 注册和登录限流、安全审计与异常登录检测;
- 邮箱验证、密码找回和密码修改;
- CSRF Token、内容安全策略与可信代理配置;
- 角色、权限、管理员、Tenant 和第三方登录;
- 全设备 Session 列表与一键退出。
在补齐限流、审计、邮箱验证策略、CSRF 威胁评估、TLS 和部署安全审查之前, 不得把身份 API 描述为公网生产就绪。