LOADING...
版本: 1.0.1
支持: Minecraft 1.21 + Fabric
简介: 防止离线模式下玩家冒名顶替,使用 EdDSA (Ed25519) 签名验证。
Minecraft 默认的离线模式 online-mode=false) 允许任何玩家以任意用户名进入服务器,这使得冒名顶替极其容易。
OfflineAuth 通过挑战-签名-验证机制,让每个玩家拥有唯一的 EdDSA 密钥对:
服务端保存一个 玩家名 → 公钥 的映射表
客户端持有私钥,用来证明自己的身份
登录时服务端发送随机挑战,客户端签名后返回,服务端用公钥验签
只有持有对应私钥的玩家才能以该用户名登录,彻底杜绝改名冒充。
将 offlineauth-1.0.1.jar 放入服务端的 mods/ 目录
确保服务端安装了 Fabric Loader ≥0.15.0 和 Fabric API
启动服务端
首次启动会自动生成示例配置文件 config/auth_keys.json
按下方 配置 步骤添加玩家公钥
将 offlineauth-1.0.1.jar 放入客户端的 mods/ 目录
确保客户端安装了 Fabric Loader ≥0.15.0 和 Fabric API
将你的私钥文件 放入客户端的 目录
启动游戏
提示: 服务端和客户端都需要安装此模组,但 jar 是同一个文件。
文件:
每个玩家一行,键是玩家的游戏名,值是 PEM 格式的公钥
玩家改名后需要同步更新此文件
文件:
客户端只需要私钥文件
私钥绝不能外泄——持有私钥的人就可以以你的身份登录
使用项目提供的 生成:
会输出两个文件:
| 文件 | 说明 | 存放位置 |
|------|------|---------|
| | 私钥 | 客户端 |
| | 公钥 | 发给服务器管理员 |
你的 私钥只需保存一份,可以进入任意多个已添加对应公钥的服务器
每进入一个新服务器,都需要将 公钥 发给该服务器的管理员
管理员将公钥添加进该服务器的 后,你即可进入
模组没有中央认证服务器,公钥分发需要玩家自行与服主沟通。
A: 该玩家的用户名没有在服务端 中配置,需要联系管理员添加。
A: 通常意味着:
客户端使用的私钥与服务端记录的公钥不匹配
玩家可能更换了密钥对但没有更新服务端配置
A: 在服务端 中,将玩家名改为新名字即可。公钥可以复用。
A: 模组在服务端启动时加载配置。如果运行时修改,需要重启。
A: 当前版本基于 1.21 编译。1.21.x 小版本需要重新编译(改 版本号)。
加密算法: EdDSA (Ed25519),JDK 标准
挑战长度: 32 字节(256 位),使用 生成
反射兼容: 服务端通过遍历 的声明字段,按类型 + 非 static + 非 final + 非 private 自动匹配玩家名字段,兼容所有映射版本
网络通信: 使用 Fabric API 的 / ,包 ID 统一使用
MIT License — 随意使用、修改和分发。
OfflineAuth — 让离线模式不再裸奔。
private_key.pemconfig/config/auth_keys.jsonconfig/private_key.pemGenKeys.javaprivate_key.pemconfig/public_key.pemconfig/auth_keys.jsonauth_keys.jsonconfig/auth_keys.jsonbuild.gradleKeyPairGenerator.getInstance("EdDSA")SecureRandomServerLoginNetworkHandlerStringServerLoginNetworkingClientLoginNetworkingofflineauth:challenge
服务端 客户端
│ │
│ ── 客户端尝试登录 ──→ │
│ │
│ 1. 服务端查找该玩家名的公钥 │
│ · 找到 → 继续 │
│ · 未找到 → 踢出:"未注册的玩家" │
│ │
│ 2. 服务端生成 32 字节随机挑战 │
│ ── 发送挑战 ──→ │
│ │
│ 3. 客户端用私钥签名挑战
│ │
│ ←── 返回签名 ── │
│ │
│ 4. 服务端用公钥验签 │
│ · 验证通过 → 允许登录 │
│ · 验证失败 → 踢出:"身份验证失败"│
│ │
-----BEGIN PRIVATE KEY-----
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQ...
-----END PRIVATE KEY-----
{
"玩家名1": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA...\n-----END PUBLIC KEY-----",
"玩家名2": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA...\n-----END PUBLIC KEY-----"
}
javac [GenKeys.java](http://GenKeys.java) && java GenKeys
# 1. 生成密钥对
javac [GenKeys.java](http://GenKeys.java) && java GenKeys
# → 得到 private_key.pem(自用)和 public_key.pem(给服主)
# 2. 将 private_key.pem 放入客户端 config/ 目录
# 3. 将 public_key.pem 发给想进的每个服务器管理员
# 1. 将 mod jar 放入服务端 mods/
# 2. 启动服务端,生成 config/auth_keys.json
# 3. 从玩家处获取公钥,按格式写入 auth_keys.json
# 4. 重启服务端或执行 /reload(需要其他插件支持)
# 需要: JDK 21+, Gradle 8.8+
cd OfflineAuthMod
gradle build
# 输出: build/libs/offlineauth-<version>.jar
评论