gpt4 book ai didi

java - Minecraft 客户端的 SHA1 加密

转载 作者:太空宇宙 更新时间:2023-11-04 07:59:34 24 4
gpt4 key购买 nike

我正在用 Java 编写 Minecraft 客户端。我已经做了很多事情,但真正困扰我的一件事是 Minecraft 如何进行身份验证。我找到了这个页面

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

它定义了协议(protocol)。目前为止,代码如下

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

是我所拥有的。正如您所见,通过这段代码,我获得了一个公钥、一个验证 token ,并生成了一个随机共享 secret 。但是,我不知道从这里该做什么。我见过这个的 Python 实现

https://github.com/ammaraskar/pyCraft/blob/master/networking/NetworkManager.py第82行

但我不明白他们是如何使用 SHA1 来获取 serverid 的。我在 Java 中找不到类似的东西。有一个专门针对 Minecraft 的身份验证方案页面,它更清楚地定义了后台发生的情况:http://wiki.vg/Protocol_Encryption

最佳答案

有一个优秀的minecraft反编译项目:

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

查看src/minecraft/net/minecraft/src/NetClientHandler.javasrc/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()}) 

关于java - Minecraft 客户端的 SHA1 加密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13057931/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com