java - 如何检查何时建立连接,如果我的世界玩家的会话作为原始玩家有效?
问题描述
我挑战自己创建一个我的世界服务器,但我将使用的大多数插件都是我的。我已经制作了许多不同的插件,从商店到各种迷你游戏。现在我决定编写自己的登录注册插件。基本上一切都已经正常运行并且准备好了,但我想在那里添加一个功能。这个功能是当玩家连接到服务器(warez)时,我的插件会检查玩家的会话以查看它是否是原始的(我的意思是玩家已经购买了游戏,并且他通过有效的 mojang 会话通过原始 mojang 启动器登录。玩家应该以warez模式连接到服务器(未登录,使用非官方启动器))。我不只是指这里提到的名字,而是他的 mojang 会议。简而言之,它是否通过原始启动器使用其电子邮件和密码登录。
我完全不知道如何验证玩家的原创性,我知道 mojang 有一个 API,但我不知道它是否提供了这种可能性。我也想知道客户端是从UUID还是sessionID向服务器发送hash,可以和mojang API对比一下,还是不知道。
更新:
我找到了这两篇文章:
1) https://wiki.vg/Protocol#Login
2) https://wiki.vg/Protocol_Encryption#Authentication
从这篇文章中我大致了解到,在客户端连接期间,我将与服务器一起发送服务器 ID 和密码,然后他们同意的后续哈希将通过 POST 将客户端发送到 mojang 服务器,然后我的服务器应该从 mojang 询问它是否登录到我的服务器客户端。
更新2
我想到了以下几点:
- 如果我在玩家将连接的现象中编写自己的代理,并且该代理会将所有内容复制到服务器。因此,我可以让我想去的人进入,我还可以通过 mojang 页面使用服务器 ID 和哈希进行交叉检查。但这将是 3-rd 方软件,它不会是插件。
- 修改 spigot 本身,我的意思是在 SSLServerSocket 级别的某个地方执行上述操作,spigot 服务器接收所有套接字和来自它们的数据。在那里,如果我对数据通过的桥进行编码,我也能够同意客户端的 SERVER ID,计算哈希并从 mojang 服务器验证它。但它仍然不在插件中,而是在服务器中。
- 从插件中覆盖上面提到的服务器的一些深层部分。该插件将在加载后替换服务器的某些部分。
现在我的问题是,如何从插件中替换一些提到的服务器部分?尝试使用反射(我是菜鸟,使用反射)并用我的函数替换一些函数是个好主意,这会回调到 spigot 低级代码?
非常感谢您的任何建议。祝你今天过得愉快。
PS:对不起我的英语不好。
解决方案
public boolean isCracked(ProxiedPlayer player) {
String name = player.getName();
UUID actualUUID = player.getUniqueId();
String actualUUIDStr = uuid.toString();
String offlineUUIDStr = getMd5("OfflinePlayer:"+name);
if(offlineUUIDStr.equals(actualUUIDStr)) {
return true;
}
return false;
}
// Taken from https://www.geeksforgeeks.org/md5-hash-in-java/
public static String getMd5(String input)
{
try {
// Static getInstance method is called with hashing MD5
MessageDigest md = MessageDigest.getInstance("MD5");
// digest() method is called to calculate message digest
// of an input digest() return array of byte
byte[] messageDigest = md.digest(input.getBytes());
// Convert byte array into signum representation
BigInteger no = new BigInteger(1, messageDigest);
// Convert message digest into hex value
String hashtext = no.toString(16);
while (hashtext.length() < 32) {
hashtext = "0" + hashtext;
}
return hashtext;
}
// For specifying wrong message digest algorithms
catch (NoSuchAlgorithmException e) {
throw new RuntimeException(e);
}
}
}
推荐阅读
- java - 抑制 Java 异常堆栈跟踪
- typescript - 实例化接口类型的变量
- python - numpy.where 条件选择二维数组中的特定垂直列
- html - HTML 画布线条多种颜色
- c# - Xamarin Xaml C# cross-platform Can't get the image in ScrollView -> AbsoluteLayout -> Image to fill the entire width
- javascript - 反应:为什么将事件对象放在事件处理程序参数的末尾
- sql-server - SQL Server:在存储过程中向操作员发送电子邮件
- google-cloud-platform - Cloud Datastore 是否支持客户提供的加密密钥?
- android - 支持蓝牙的安卓模拟器
- sdk - 如何在没有完整安装 Visual Studio 的情况下获取 MSBuild 15?