ModMdo
一个服务端多功能 Mod。
一些功能需要客户端安装才能使用。
目前的主要用途在白名单,但是不止这一个功能。
因为使用方式已修改,所以以下介绍适用于ModMdo v1.0.27以后的版本。
ModMdo v1.0.27后
原版的白名单由于使用用户名,不判断UUID导致离线服务器很不安全。
因此ModMdo提供了一个独立于原版的白名单。
ModMdo白名单需要在客户端安装,在客户端只需要安装,无需其他任何操作。
在游戏内使用以下命令开启:
/modmdo useModMdoWhitelist enable
在此之前可能先需要使用
/temporary whitelist add <玩家名>
来为自己添加白名单,否则则需要在控制台添加。
使用
/modmdo whitelist remove <玩家名>
删除玩家的白名单。
正版兼容
如果不希望在客户端安装ModMdo,但是希望能够在服务器使用ModMdo白名单的话,
那么需要在服务端配置文件中将online-mode设为true,也就是需要玩家必须有正版minecraft账号。
然后使用命令:
/modmdo compatibleOnlineMode enable
来开启在线模式与ModMdo白名单的兼容模式(此选项默认开启)。
后续的白名单添加操作与先前介绍的无差别,直接添加临时白名单然后连接服务器即可。
同理,将以上命令的enable改为disable将在线模式兼容关闭。
关闭后需要玩家必须安装ModMdo才可以进服。
实现
服务端见:
登录实现 - ServerLoginNetworkHandlerMixin.java
校验实现 - ServerPlayNetworkHandlerMixin.java
客户端见:
登录实现 - ClientPlayNetworkHandlerMixin.java
ModMdo修改了服务端的加入游戏方法,
将在加入游戏时向客户端发送标记数据,让客户端发送登录信息给服务器,
而且ModMdo在开启白名单时要求必须经过登录检查才允许加入服务器。
在开启白名单时,玩家有一段时间将信息发送登录给服务器。
如果超过指定时间后服务端仍未收到客户端的信息,就会断开玩家的连接,
而如果是收到了错误的信息,则不会等待这么长时间,会直接断开连接,
如果信息没有问题,才会给予玩家放行,此时才会开始发送游戏交互数据(区块、玩家、实体等)。
1.0.27版本以前
ModMdo v1.0.27以前的版本在此称为旧版本。
旧版本所使用的检查方式是登陆时发送一个token,
由服务器生成token,再由服务器管理将此分发给玩家,
玩家需要将它填入游戏的"添加服务器"页面的“Token”选项,
或是手动写入配置文件(于config/modmdo/configs/specified_token.mhf中)。
新版本已经不再兼容此方式。
使用旧版本ModMdo登录到使用新版本ModMdo服务器时,
会提示“obsolete login type”并断开连接。
管理功能
封禁玩家
此命令从v1.0.35版本起可以使用。
封禁玩家需要启用ModMod白名单才可以使用,否则请使用原版的 /ban 命令。
使用
/temporary ban add <玩家名> <时间(分钟)>
在一段时间内封禁玩家,将add换为reduce可以减少玩家封禁的时间。
使用
/temporary ban add <玩家名> -1
进行无期限封禁玩家。
使用
/temporary ban remove <玩家名>
对玩家进行解封。
当一名玩家已经在一段时间内被封禁,此时再运行封禁命令会自动对该玩家进行加时封禁,
但是此命令对无期限封禁的玩家没有意义。
邀请
使用
/temporary invite add <玩家名> <时间(分钟)>
来添加一个邀请,将add换为reduce可以减少邀请有效时间。
使用
/temporary invite remove <玩家名>
来取消邀请。
当一名玩家已经被邀请,此时再运行邀请命令会自动对该玩家进行加时邀请。
注意:邀请不能当做白名单使用,在服务器关闭时所有的邀请都会一律失效。
安全性功能
独立ID
(此功能适用情景:在A服务器泄露ID,在B服务器不能被使用)
自v1.0.37版本起,支持独立ID或者使用不共享的本地密钥加密ID,此功能不需要服务端支持。
修改配置文件 config/modmdo/secure_level.modmdo 来设置需要的方法。
支持 UNEQUAL_ID 、 UNEQUAL_KEY 、 NO_SECURE。
分别为独立ID、本地密钥加密、使用原始ID。
独立ID理论上来说是最安全的,但是也是占用硬盘最大的。
本地密钥匙只有16位(自v1.0.39起为32位),使用AES256加密原ID,注意此加密是可逆的,所以当你的id泄露后,可以在解密16^91(或32^91)次计算并检查后一定成功破解出你的原始ID,相对于独立ID更容易破解,但是也近乎不可能。
ID真实性
(此功能适用情景:在某服务器的ID泄露,但不能被使用)
自v1.0.39版本起,支持使用不保存的密钥来校验ID真实性,此功能需要服务端和客户端同时支持。
在登录时,玩家会发送在此服务器的ID,以及一个加密后的数据,
此数据原为可序列化的数据,且数据内可以通过某些特定算法提取出原始ID,
这时玩家还会附带一个密钥,服务器将会使用它来解密这个数据,但不会保存它。
只有当解密成功且提取出来的ID与原始ID相同,才会认可玩家。
因此,无法在获取某玩家ID的情况下直接加入服务器,此功能相当于逼迫使用暴力破解这种极低效方式来攻击账号。
散列存储
自v1.0.42起,服务端存储的标识符是被SHA3-512散列处理过的。
在登录时服务端会处理原始标识符再去与存储的比对,这导致即使将数据库和玩家的密钥全部泄露出去也没有用。
鉴于SHA3-512的碰撞难度,可以说目前几乎已经彻底实现了无法暴破。
计划中
中间人攻击
正在计划对中间人攻击做出措施。
中间人攻击原理为让客户端连接到假的服务端,通过虚假数据包骗取玩家发送信息,
目前暂时没有测试这个攻击方式,但是理论上来说目前的ModMdo是可以被此方法攻击的。
仅登录
ModMdo提供了一个将登录功能分离出来的jar,
此jar为客户端mod,仅有登录功能,服务端安装无效。
仓库: cao-awa/ModMdo at auth (github.com)
已发布的:ModMdoAuth · Releases · cao-awa/ModMdo (github.com)
其他
不要用修改fabric.mod.json版本的方式在更低版本运行,
由于版本差异过大,这将是一定不会成功的。
但可以尝试修改源代码内的那些mixin来将ModMdo放到更低版本运行。
以及,此模组暂时已经停止更新,以下情况例外:
出现了漏洞
游戏版本更新
想到了更好的方式
要那么安全有什么用呢(