我挑战自己创建一个我的世界服务器,但前提是我将使用的大多数插件都是我的。从商店到各种迷你游戏,我已经制作了许多不同的插件。现在,我决定编写自己的登录注册插件。基本上所有功能都已就绪并可以使用,但是我想在此添加一项功能。此功能是当玩家连接到服务器(warez)时,我的插件会检查玩家的会话以查看其是否为原始(我的意思是玩家已购买了游戏,并且他通过有效的mojang会话通过原始mojang启动器登录玩家应该以warez模式连接服务器(未登录,未使用官方启动器)。我的意思不是这里提到的名字,而是他的mojang会话。简而言之,是否通过原始启动器使用电子邮件和密码登录。
我绝对不知道验证玩家原创性的工作原理,我知道mojang具有API,但我不知道它是否提供这种可能性。我还想知道客户端是否正在从UUID或sessionID向服务器发送哈希,可以与mojang API进行比较,或者我不知道。
更新:
我找到了这两篇文章:
1) https://wiki.vg/Protocol#Login
2) https://wiki.vg/Protocol_Encryption#Authentication
从本文中,我大致了解到,在客户端连接期间,我将与服务器一起发送服务器ID和密码,然后他们将同意的后续哈希将通过POST将客户端发送到mojang服务器和我的然后,服务器应从mojang询问客户端是否已在我的服务器上登录。
UPDATE2
我想到了以下内容:
现在我的问题是,如何从插件替换服务器中提到的某些部分?尝试使用反射(我是菜鸟,有反射)并用我的函数替换一些函数,这会回调出低级代码是个好主意吗?
非常感谢您的任何建议。 祝你有美好的一天。
PS:对不起,我的英语不好。
答案 0 :(得分:0)
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);
}
}
}