CERTUTIL - Hash y Base64
Las páginas de descarga suelen mostrar una cadena como «SHA-256: 3a7bd3e2…». Es un valor hash, que sirve para comprobar que el archivo descargado no está dañado ni ha sido manipulado.
Windows incluye el comando CERTUTIL, que calcula valores hash sin instalar ningún programa adicional.
¿Qué es un valor hash?
Un valor hash es una cadena de longitud fija calculada a partir del contenido de un archivo. Si cambia un solo byte, el resultado es completamente distinto. Si el hash publicado coincide con el de tu archivo local, puedes confirmar que es el mismo archivo.
Uso básico
CERTUTIL -hashfile archivo [algoritmo]
certutil -hashfile setup.exe SHA256
La segunda línea es el valor hash. El texto de los mensajes depende del idioma de visualización del sistema, pero la segunda línea siempre es el valor hash.
Si omites el algoritmo, se calcula con SHA1. Cuando el editor publique un valor SHA-256, indica
siempre SHA256 de forma explícita.
Algoritmos admitidos
| Algoritmo | Descripción |
|---|---|
MD2, MD4 | 128 bits. Muy antiguos; no deben usarse |
MD5 | 128 bits. Antiguo; no apto para detectar manipulaciones |
SHA1 | 160 bits. Valor predeterminado; también poco seguro |
SHA256 | 256 bits. El más utilizado actualmente |
SHA384 | 384 bits |
SHA512 | 512 bits |
Se sabe que es posible crear deliberadamente archivos distintos con el mismo hash MD5 o SHA1. Sirven para detectar daños accidentales, pero no para confirmar que un archivo no ha sido alterado de forma maliciosa. Usa SHA256 o superior siempre que el editor lo proporcione.
Comparar con un hash publicado
Los valores hash son largos y es fácil equivocarse al compararlos a simple vista. Pasar el valor publicado a findstr permite una comprobación fiable.
certutil -hashfile setup.exe SHA256 | findstr /I "3a7bd3e2360a3d29eea436fcfb7e44c735d117c42d1c1835420b6b9942dd4f1b"
Si coincide, se muestra la línea; si no, no se muestra nada. La opción /I ignora las diferencias entre mayúsculas y minúsculas.
La línea CertUtil: -hashfile command completed successfully. aparece con cualquier archivo, sin
importar el hash. Buscar el propio valor hash evita falsos positivos por esa línea.
Comparar automáticamente en un archivo por lotes
Este ejemplo compara el archivo recibido como argumento con el hash esperado.
@echo off
setlocal EnableDelayedExpansion
set "FILE=%~1"
set "EXPECTED=%~2"
set "ACTUAL="
for /f "skip=1 delims=" %%H in ('certutil -hashfile "%FILE%" SHA256') do (
if not defined ACTUAL set "ACTUAL=%%H"
)
set "ACTUAL=!ACTUAL: =!"
if /I "!ACTUAL!"=="%EXPECTED%" (
echo [OK] Los valores hash coinciden.
) else (
echo [NG] Los valores hash no coinciden.
exit /b 1
)
endlocal
verify_hash.cmd setup.exe 3a7bd3e2360a3d29eea436fcfb7e44c735d117c42d1c1835420b6b9942dd4f1b
skip=1 omite la línea de encabezado y solo se guarda en la variable la primera línea obtenida (el valor hash). En versiones antiguas de Windows el hash se muestra con un espacio cada dos caracteres, por lo que !ACTUAL: =! elimina los espacios.
Codificar y decodificar Base64
CERTUTIL también puede convertir un archivo en una cadena Base64.
certutil -encode input.bin output.txt
certutil -decode output.txt restored.bin
Un archivo creado con -encode lleva una línea -----BEGIN CERTIFICATE----- al principio y una
línea -----END CERTIFICATE----- al final, aunque los datos no sean un certificado. -decode
restaura el archivo correctamente con esas líneas. Si necesitas solo el texto Base64, elimínalas.
Si ya existe un archivo con el mismo nombre en el destino, el comando falla. Para sobrescribirlo,
añade -f, como en certutil -f -encode input.bin output.txt. Con -f se sobrescribe sin pedir
confirmación, así que ten cuidado de no indicar un archivo importante.
Errores comunes
Si no se encuentra el archivo, aparece un error como este:

中小企業経営者のためのRPA入門 RPA導入を成功させる方法

60分でわかる! AIエージェント 超入門

コマンドラインの黒い画面が怖いんです。

知識・才能ゼロでもらく~に月10万円稼ぐ! よくわかるAI副業超入門
Si el nombre del archivo contiene espacios, enciérralo entre comillas dobles, como "my file.exe".
Si falla, se devuelve un código de salida distinto de 0. Cuando no se encuentra el archivo es un valor negativo como -2147024894, así que compruébalo con IF %ERRORLEVEL% NEQ 0 o con || en lugar de IF ERRORLEVEL 1.
Resumen
| Operación | Comando |
|---|---|
| Calcular SHA-256 | certutil -hashfile archivo SHA256 |
| Calcular MD5 | certutil -hashfile archivo MD5 |
| Convertir un archivo a Base64 | certutil -encode entrada salida |
| Restaurar desde Base64 | certutil -decode entrada salida |