Saltar al contenido
Seguridad

Comprueba la huella de Paper y de tus plugins

Comprueba con PowerShell que el jar de Paper y tus plugins son idénticos a los que publica su autor, comparando sus huellas (SHA-256 y SHA-512).

MinecraftIntermedio≈15 minRevisada el 28 oct 2026Amaru
  • Última prueba: 28 oct 2026
  • Revisión externa: sin revisión externa

Requisitos previos

  • Windows con PowerShell (probado con Windows PowerShell 5.1).
  • Conexión a internet.
  • Un servidor Paper en marcha (solo para el último paso).
  • Una carpeta de trabajo vacía para las descargas: el paso 5 recorre todos los .jar que haya en ella.

Probado en

Probado en: Windows 11 Home de 64 bits con Windows PowerShell 5.1, el 2026-10-28, en el equipo de kraslich. Se probó contra las API reales de Paper (compilación 227 de la 26.3) y de Modrinth (LuckPerms 5.5.71). No se ha comprobado en Linux, en macOS ni con PowerShell 7.

Pregunta a la API de Paper por la última compilación y su huella

La API de Paper publica cada compilación con su huella SHA-256 y exige un «User-Agent» con un contacto. La primera orden lo guarda en «$ua»: pon tu correo o tu web en lugar del de ejemplo. «Invoke-RestMethod» pide la lista de compilaciones de la 26.3, entre paréntesis para que PowerShell 5.1 la separe en elementos. «Where-Object» deja las del canal STABLE y «Select-Object -First 1» se queda con la primera, como hace la documentación de Paper para la última estable. «$b.id» y «$b.channel» muestran el número y el canal. «$d» guarda la descarga del servidor; con «$d.name» ves el archivo y con «$d.checksums.sha256» su huella, que la API da en minúsculas. Verás «227», «STABLE» y «paper-26.3-227.jar».

Consola de PowerShell (recorte): se pide a la API de Paper la última compilación estable de la 26.3 y salen su número (227), el canal, el nombre del jar y su huella SHA-256 en minúsculas
powershell
$ua = 'mi-servidor ([email protected])'
$b = (Invoke-RestMethod -Uri 'https://fill.papermc.io/v3/projects/paper/versions/26.3/builds' -UserAgent $ua) | Where-Object channel -eq 'STABLE' | Select-Object -First 1
$b.id
$b.channel
$d = $b.downloads.'server:default'
$d.name
$d.checksums.sha256

Según la documentación de docs.papermc.io (se abre en otra pestaña) · consultada el 28 oct 2026 · (; observado en laboratorio).

Descarga el archivo desde la dirección que da la API

Ahora que tienes la URL en «$d.url», «Invoke-WebRequest» descarga el archivo y con el parámetro «-OutFile» guarda el resultado en un fichero con el nombre que te dio la API. La línea lleva también «-UserAgent» «$ua» porque la API de Paper exige un «User-Agent» en todas las peticiones.

powershell
Invoke-WebRequest -Uri $d.url -OutFile $d.name -UserAgent $ua
NotaCon Windows PowerShell 5.1 la barra de progreso que se muestra en la consola hace la descarga más lenta: unos 30 segundos en las pruebas frente a pocos segundos sin ella. Se quita escribiendo antes «$ProgressPreference = 'SilentlyContinue'».

Según la documentación de learn.microsoft.com (se abre en otra pestaña) · consultada el 28 oct 2026 · (; observado en laboratorio).

Calcula la huella del archivo y compárala con la publicada

Ahora tienes el archivo en tu carpeta. «Get-FileHash» calcula la huella SHA-256 y la guarda en «$h». Si cambias un solo carácter del contenido, la huella cambia. Dos huellas iguales significan el mismo contenido. «Get-FileHash» da la huella en mayúsculas y la API en minúsculas; con «-eq» la comparación da True porque PowerShell no distingue mayúsculas (la versión que sí las distingue es «-ceq»). La comparación con «-eq» es la que usa Microsoft en la documentación de «Get-FileHash».

Consola de PowerShell (recorte): Get-FileHash da la huella en mayúsculas, la API la da en minúsculas, y la comparación con -eq contesta True
powershell
$h = (Get-FileHash -Algorithm SHA256 -Path $d.name).Hash
$h
$d.checksums.sha256
$h -eq $d.checksums.sha256

Según la documentación de learn.microsoft.com (se abre en otra pestaña) · consultada el 28 oct 2026 · (; observado en laboratorio).

Haz lo mismo con un plugin

El ejemplo es LuckPerms, de Modrinth. La API devuelve dos huellas por archivo, SHA-1 y SHA-512. La petición usa el mismo «$ua» del paso 1 y filtra por cargador Paper y versión del juego; la dirección va entre comillas simples. La documentación no dice en qué orden llegan las versiones; en las pruebas del 2026-10-28 llegaban de la más reciente a la más antigua, y «$v[0]» es la primera. «.files[0]» es su primer archivo (para LuckPerms 5.5.71 y Paper 26.3 solo hay uno). Verás el nombre del jar y, al final, True. «Get-FileHash» devuelve la SHA-512 en mayúsculas, pero con «-eq» la comparación da True porque PowerShell no distingue mayúsculas.

Consola de PowerShell (recorte): se pide a Modrinth la versión de LuckPerms para Paper 26.3, se muestra el nombre del jar, se descarga y la comparación de la huella SHA-512 contesta True
powershell
$v = Invoke-RestMethod -Uri 'https://api.modrinth.com/v2/project/luckperms/version?loaders=["paper"]&game_versions=["26.3"]' -UserAgent $ua
$f = $v[0].files[0]
$f.filename
Invoke-WebRequest -Uri $f.url -OutFile $f.filename -UserAgent $ua
(Get-FileHash -Algorithm SHA512 -Path $f.filename).Hash -eq $f.hashes.sha512

Según la documentación de docs.modrinth.com (se abre en otra pestaña) · consultada el 28 oct 2026 · (; observado en laboratorio).

Guarda las huellas y repite la comprobación cuando quieras

Guarda las huellas SHA-256 de todos los .jar de la carpeta donde estás en un archivo CSV y luego vuelve a comprobarlos cuando quieras. «Export-Csv» convierte los objetos en un CSV y «-NoTypeInformation» quita la primera línea, la que empieza por #TYPE. «Select-Object» con una expresión calculada extrae solo la huella y el nombre del fichero, sin la ruta completa de tu equipo. La segunda orden lee el CSV, recalcula la huella de cada .jar y escribe «OK» si la huella sigue siendo la misma o «CAMBIADO» si ha variado. Lo normal es ver «OK» en cada línea; si cambias un byte de un archivo, solo esa línea dice «CAMBIADO».

Consola de PowerShell (recorte): la comprobación del CSV de huellas escribe OK en los tres archivos .jar de la carpeta
powershell
Get-ChildItem *.jar | Get-FileHash -Algorithm SHA256 | Select-Object Hash, @{n='Archivo';e={Split-Path $_.Path -Leaf}} | Export-Csv huellas.csv -NoTypeInformation
Import-Csv huellas.csv | ForEach-Object { if ((Get-FileHash -Algorithm SHA256 -Path $_.Archivo).Hash -eq $_.Hash) { "OK        " + $_.Archivo } else { "CAMBIADO  " + $_.Archivo } }

Según la documentación de learn.microsoft.com (se abre en otra pestaña) · consultada el 28 oct 2026 · (; observado en laboratorio).

Mira qué puertos escucha tu servidor

Si el servidor está en marcha, puedes ver qué puertos está abriendo. «Get-Process java» busca el proceso Java y «Get-NetTCPConnection» lista las conexiones TCP activas. Con «-State Listen -OwningProcess» filtras para dejar solo las que están escuchando y pertenecen a los procesos Java: si tienes más de uno abierto, salen los puertos de todos. Esperable: una sola línea con el puerto 25565, que es el puerto por defecto de un servidor de Minecraft Java. Si ves otros puertos que no esperas, merece la pena averiguar qué los abre.

Consola de PowerShell (recorte): con el servidor en marcha, Get-NetTCPConnection solo enseña una línea: el puerto 25565 en estado Listen
powershell
Get-NetTCPConnection -State Listen -OwningProcess (Get-Process java).Id

Según la documentación de learn.microsoft.com (se abre en otra pestaña) · consultada el 28 oct 2026 · (; observado en laboratorio).

Solución de errores comunes

La comparación da False

Probablemente comparaste la huella de otra compilación con el archivo actual (por ejemplo, el jar de la 226 frente a la huella de la 227). Baja el archivo de nuevo desde la dirección que da la API y, si sigue dando False, no lo uses.

Consola de PowerShell (recorte): el jar de la compilación 226 comparado con la huella de la 227 contesta False
Las huellas parecen distintas, pero solo cambian las mayúsculas

«Get-FileHash» devuelve la huella en mayúsculas y la API la da en minúsculas. Con «-eq» la comparación da True porque PowerShell no distingue mayúsculas al comparar cadenas.

Consola de PowerShell (recorte): la huella calculada en mayúsculas y la de la API en minúsculas; con -eq la comparación contesta True
La comprobación guardada dice CAMBIADO

El archivo ya no es el mismo que guardaste en el CSV. Si no lo actualizaste a propósito, bórralo, vuelve a bajarlo de la fuente original y comprueba su huella.

Consola de PowerShell (recorte): tras añadir un byte a LuckPerms-Bukkit-5.5.71.jar, la comprobación escribe CAMBIADO solo en ese archivo y OK en los otros dos
Get-Process : No se encuentra ningún proceso con el nombre java

El servidor no está en marcha o su proceso no se llama «java». Arranca el servidor y repite la orden; si ya está en marcha, mira el nombre de su proceso con «Get-Process». El mensaje sale en castellano en el equipo de pruebas; en otro idioma cambia.

Consola de PowerShell (recorte): sin el servidor en marcha, Get-Process contesta que no encuentra ningún proceso con el nombre «java» y Get-NetTCPConnection que el argumento es nulo
No se puede indizar en una matriz nula

La respuesta de la API llegó vacía y por eso falla «$v[0]». Hay dos causas. La primera: la dirección de Modrinth del paso 4 se escribió entre comillas dobles en lugar de comillas simples. La segunda: Modrinth no tiene ninguna versión de LuckPerms para la versión del juego que pusiste; en ese caso «$v.Count» da 0, así que cambia «26.3» por una versión que sí tenga archivo. Escribe la dirección con comillas simples tal como aparece en el paso 4.

Consola de PowerShell (recorte): la petición a Modrinth con una versión del juego sin archivo deja la lista vacía y «$v[0].files[0]» da «No se puede indizar en una matriz nula.»

Lo que no se ha comprobado

Lo que no se ha comprobado: las huellas de GitHub o de Hangar, las firmas digitales, el contenido de los archivos, otro idioma del sistema y que lo repita una persona. El paso 6 se probó con un solo servidor. Una huella igual a la publicada demuestra que el archivo es idéntico al que publica la fuente, no que el programa sea inofensivo. Ninguna práctica garantiza una seguridad absoluta. El tiempo de 15 minutos es una estimación.

¿Te ha resultado útil esta guía?

Última revisión: 28 oct 2026 · Si algo ha cambiado, avísanos.