1

私はJavaでMinecraftのクライアントを書いています。私はすでに多くのことを行っていますが、私を本当に困惑させたのは、Minecraftが認証を行う方法です。このページを見つけました

http://wiki.vg/Protocol#Handshake_.280x02.29

プロトコルを定義します。現在のところ、次のコード

public boolean connect(String ip, int port) {
    try {
        socket = new Socket(ip, port);
        dis = new DataInputStream(socket.getInputStream());
        dos = new DataOutputStream(socket.getOutputStream());
        dos.writeByte(0x02);
        dos.writeByte(0x00);
        writeString(username);
        writeString(ip);
        dos.writeInt(port);
        if (dis.readByte() != 0xFD)
            return false;
        String serverId = readString();
        byte[] publicKey = new byte[dis.readShort()];
        for (int i = 0; i < publicKey.length; i++)
            publicKey[i] = dis.readByte();
        byte[] token = new byte[dis.readShort()];
        for (int i = 0; i < token.length; i++)
            token[i] = dis.readByte();
        PublicKey serverPublicKey = KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(publicKey));
        byte[] sharedSecret = new byte[16];
        new Random().nextBytes(sharedSecret);
        URL url = new URL("http://session.minecraft.net/game/joinserver.jsp?user=" + username + "&sessionId=" + session + "&serverId=" + serverId);
        url.openConnection();

        Cipher cipher = Cipher.getInstance("AES");
        return true;
    }
    catch (Exception ex) { System.out.println("Failed to login for " + username); ex.printStackTrace(); }
    return false;
}

私が持っているものです。このコードを通じて、お分かりのように、公開鍵と検証トークンを取得し、ランダムな共有シークレットを生成します。しかし、ここからどうしたらいいのかわかりません。私はこれのPython実装を見てきました

https://github.com/ammaraskar/pyCraft/blob/master/networking/NetworkManager.py82行目

しかし、彼らがどのようにSHA1を使用してサーバーIDを取得したのか理解できません。Javaで同等のものが見つかりません。ここにバックグラウンドで何が起こるかをより明確に定義するMinecraftに固有の認証スキームページがあります:http ://wiki.vg/Protocol_Encryption

4

1 に答える 1

1

Minecraftには優れた逆コンパイルプロジェクトがあります。

http://mcp.ocean-labs.de/index.php/MCP_Releases

src/minecraft/net/minecraft/src/NetClientHandler.java、、をご覧くださいsrc/minecraft/net/minecraft/src/ThreadLoginVerifier.java

実際のハッシュはsrc/minecraft/net/minecraft/src/CryptManager.java、次のように行われます。

digestOperation("SHA-1", new byte[][] {par0Str.getBytes("ISO_8859_1"), par2SecretKey.getEncoded(), par1PublicKey.getEncoded()}) 
于 2013-04-29T12:23:58.603 に答える