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».
$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- API de descargas de Paper (se abre en otra pestaña)
- Invoke-RestMethod en Microsoft Learn (se abre en otra pestaña)
- Introducción a la API de Modrinth (se abre en otra pestaña)
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.
Invoke-WebRequest -Uri $d.url -OutFile $d.name -UserAgent $uaSegú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».
$h = (Get-FileHash -Algorithm SHA256 -Path $d.name).Hash
$h
$d.checksums.sha256
$h -eq $d.checksums.sha256- Get-FileHash en Microsoft Learn (se abre en otra pestaña)
- Operadores de comparación de PowerShell (se abre en otra pestaña)
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.
$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- Listar las versiones de un proyecto en la API de Modrinth (se abre en otra pestaña)
- LuckPerms en Modrinth, página del proyecto (se abre en otra pestaña)
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».
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 } }- Export-Csv en Microsoft Learn (se abre en otra pestaña)
- Import-Csv en Microsoft Learn (se abre en otra pestaña)
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.
Get-NetTCPConnection -State Listen -OwningProcess (Get-Process java).Id- Get-NetTCPConnection en Microsoft Learn (se abre en otra pestaña)
- Get-Process en Microsoft Learn (se abre en otra pestaña)
- Referencia de server.properties de Paper (server-port) (se abre en otra pestaña)
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.
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.
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.
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.
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.
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.
Última revisión: 28 oct 2026 · Si algo ha cambiado, avísanos.