首页 > 解决方案 > 如何检查何时建立连接,如果我的世界玩家的会话作为原始玩家有效?

问题描述

我挑战自己创建一个我的世界服务器,但我将使用的大多数插件都是我的。我已经制作了许多不同的插件,从商店到各种迷你游戏。现在我决定编写自己的登录注册插件。基本上一切都已经正常运行并且准备好了,但我想在那里添加一个功能。这个功能是当玩家连接到服务器(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

我想到了以下几点:

  1. 如果我在玩家将连接的现象中编写自己的代理,并且该代理会将所有内容复制到服务器。因此,我可以让我想去的人进入,我还可以通过 mojang 页面使用服务器 ID 和哈希进行交叉检查。但这将是 3-rd 方软件,它不会是插件。
  2. 修改 spigot 本身,我的意思是在 SSLServerSocket 级别的某个地方执行上述操作,spigot 服务器接收所有套接字和来自它们的数据。在那里,如果我对数据通过的桥进行编码,我也能够同意客户端的 SERVER ID,计算哈希并从 mojang 服务器验证它。但它仍然不在插件中,而是在服务器中。
  3. 从插件中覆盖上面提到的服务器的一些深层部分。该插件将在加载后替换服务器的某些部分。

现在我的问题是,如何从插件中替换一些提到的服务器部分?尝试使用反射(我是菜鸟,使用反射)并用我的函数替换一些函数是个好主意,这会回调到 spigot 低级代码?

非常感谢您的任何建议。祝你今天过得愉快。

PS:对不起我的英语不好。

标签: javaminecraft

解决方案


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);
        }
    }
}


推荐阅读