yushijinhun / authlib-injector

Build your own Minecraft authentication system.
https://authlib-injector.yushi.moe
GNU Affero General Public License v3.0
730 stars 66 forks source link

关于Wiki中Mojang的hashing method的补充 #157

Closed yl12053 closed 2 years ago

yl12053 commented 2 years ago

根据Wiki中所说,Mojang所使用的hash方法共有61个hex字符 经过测试(拿我自己的账号去fetch) GET https://sessionserver.mojang.com/session/minecraft/profile/e1be62e097e74c02a39446b71d951df0 将其中的texture资料base64解码后得到

{
  "timestamp" : 1650367901308,
  "profileId" : "e1be62e097e74c02a39446b71d951df0",
  "profileName" : "yjgsvj",
  "textures" : {
    "SKIN" : {
      "url" : "http://textures.minecraft.net/texture/3b60a1f6d562f52aaebbf1434f1de147933a3affe0e764fa49ea057536623cd3",
      "metadata" : {
        "model" : "slim"
      }
    }
  }
}

(我没上皮肤,用的alex) 其中hash值为3b60a1f6d562f52aaebbf1434f1de147933a3affe0e764fa49ea057536623cd3, 共64个hex字符(即32byte)

>>> import hashlib, requests
>>> hashlib.sha256(requests.get("http://textures.minecraft.net/texture/3b60a1f6d562f52aaebbf1434f1de147933a3affe0e764fa49ea057536623cd3").content).hexdigest()
'3b60a1f6d562f52aaebbf1434f1de147933a3affe0e764fa49ea057536623cd3'

, 同mojang给的hash值相等 为了避免是没装皮肤的原因, 随机找了一个路人账号 GET https://sessionserver.mojang.com/session/minecraft/profile/f57d69a08f404c379fd58dca9ad5fc54 之后base64 decode

{
  "timestamp" : 1650368517916,
  "profileId" : "f57d69a08f404c379fd58dca9ad5fc54",
  "profileName" : "anapa",
  "textures" : {
    "SKIN" : {
      "url" : "http://textures.minecraft.net/texture/8434f037b6a73d190a3b5ec170f379cc78e6460922d4611d744a8a82b96c74a8"
    }
  }
}

一样,8434f037b6a73d190a3b5ec170f379cc78e6460922d4611d744a8a82b96c74a8是64个hex字符

>>> hashlib.sha256(requests.get("http://textures.minecraft.net/texture/8434f037b6a73d190a3b5ec170f379cc78e6460922d4611d744a8a82b96c74a8").content).hexdigest()
'8434f037b6a73d190a3b5ec170f379cc78e6460922d4611d744a8a82b96c74a8'

所以其实mojang的hashing algorithm就是SHA256(image_bin) 这样想的话, 现在的hashing algorithm还是有可能撞mojang的

yushijinhun commented 2 years ago

感谢反馈。

我测试了下,Mojang 官方的计算方法现在确实变成了直接算图像的 SHA-256。碰撞可以被认为是不可能发生的,到目前还没有发现过 SHA-256 算法的碰撞。

已经更新了规范,现在不再规定材质 hash 的计算方法,改由服务器自行决定,建议至少采用 SHA-256。