安全说明 - lmxdg/ZeroLogin GitHub Wiki

安全说明

本页说明 ZeroLogin 的安全设计与使用建议。


口令存储

  • 算法:PBKDF2-HMAC-SHA256
  • 加盐:每个账号独立随机盐(16 字节)
  • 迭代次数:默认 120000(可通过 pbkdf2-iterations 调整,下限 1000)
  • 存储格式:$pbkdf2$<迭代次数>$<盐>$<散列>

即使账号文件泄露,也难以直接还原明文口令。

透明参数升级

玩家每次登录成功时,若存储散列的迭代次数低于当前配置,插件会自动用新参数重新散列并保存。因此提升 pbkdf2-iterations 后,存量账号会在玩家下次登录时逐步升级,无需强制重置。

防侧信道

口令比较使用 MessageDigest.isEqual(常量时间),避免通过响应时间差异推断散列内容。

内存擦除

口令在校验完成后立即用零填充清除对应的字符数组,减少明文在内存中的驻留时间。


登录保护

未认证玩家会被拦截以下行为,防止其破坏服务器或在世界中被其他机制影响:

拦截项 说明
移动 冻结位置位移,仅允许转动视角
命令 仅放行 allowed-commands 中的命令
聊天 禁止发言
方块 禁止破坏、放置
交互 禁止右键交互、丢弃物品
战斗 禁止受到伤害
背包 禁止打开背包、点击物品

配合 login-timeout-seconds(超时踢出)与 max-login-attempts(错误次数上限),降低暴力破解与挂机占用。


自动登录的权衡

IP 自动登录与会话恢复提升了体验,但存在风险:

  • 同一 IP 可能被多人共享(校园网、网吧、家宽 NAT)。同 IP 下的其他玩家可能借道进入。
  • 会话恢复基于 IP,若玩家 IP 频繁变动则体验与安全性同时下降。

建议

场景 建议
公共服务器 / 安全优先 session.ip-auto-login: false、session.remember-seconds: 0
小服 / 朋友服 保持默认,或按需放宽

权限风险

  • zerologin.bypass 会让玩家跳过全部认证。请仅授予可信人员(如管理员)。
  • zerologin.* 默认包含 zerologin.bypass,授予时需留意。

与正版验证的关系

  • 若服务端可开启 online-mode=true(正版验证),通常无需登录插件。
  • ZeroLogin 面向离线模式(盗版服)场景,此时玩家身份不受 Mojang 校验,登录插件是必要的账号隔离手段。

账号数据安全

  • zerologin.db 与 accounts/*.txt 含口令散列,请限制文件权限,勿公开分享备份。
  • 建议定期备份(sqlite 后端复制单文件即可),并避免把备份放到可公开访问的位置。
  • /zerologin migrate force 执行前会自动把目标后端现有账号导出为文本备份(backups/migrate-<时间戳>/),误操作可回滚。

性能与稳定性

  • 账号读写全部在存储后端的专用 IO 线程执行,主线程只处理 Future 回调,登录高峰不卡顿。
  • SQLite 使用 WAL 模式与 busy_timeout;启动时执行 PRAGMA integrity_check,数据库异常只告警、不阻断插件启用。

相关: 账号数据 · 配置说明

⚠️ **GitHub.com Fallback** ⚠️