安全说明 - 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,数据库异常只告警、不阻断插件启用。