Get-FileHash en PowerShell: verificar hash SHA256 de archivos

Descargaste el instalador de Firefox directamente desde el sitio oficial. El antivirus no protestó. Pero, ¿cómo saber si, entre el servidor de Mozilla y tu disco, nadie cambió ese archivo por una versión modificada? La respuesta está en dos líneas de PowerShell y un número de 64 caracteres hexadecimales.
Qué es Get-FileHash
Get-FileHash es un cmdlet nativo de PowerShell (disponible desde la versión 4.0) que calcula el valor de hash de cualquier archivo. Un hash es una "huella digital" matemática del contenido: cualquier cambio de un solo byte produce un hash completamente distinto. Si el hash que calculaste coincide con el que publicó el fabricante, el archivo es idéntico al que salió de su servidor.
Forma parte del módulo Microsoft.PowerShell.Utility, ya cargado por defecto — no requiere instalación adicional ni privilegios de administrador en la mayoría de los casos.
Sintaxis básica
# Calcular el hash SHA256 de un archivo (algoritmo por defecto)
Get-FileHash -Path "C:\Downloads\firefox-installer.exe"
# Salida esperada:
# Algorithm Hash Path
# --------- ---- ----
# SHA256 9F86D081884C7D659A2FEAA0C55AD015A3BF4F1B2B0B822CD15D6C15B0F00A08 C:\...
El parámetro -Algorithm define el algoritmo. Los soportados en PowerShell 7 son SHA1, SHA256, SHA384, SHA512 y MD5. El predeterminado es SHA256 — úsalo a menos que el fabricante publique el hash en otro formato. MD5 y SHA1 se consideran inseguros para verificación criptográfica, pero todavía aparecen en distribuciones Linux más antiguas y en paquetes de nicho.
¿Cómo comparar el hash calculado con el oficial?
Copia el hash publicado por el fabricante y compáralo directamente en PowerShell con el operador -eq. El resultado True confirma que el archivo no fue alterado; False significa que algo está mal.
# Hash oficial publicado por el fabricante (ejemplo ilustrativo)
$hashOficial = "B4D8A4F3E92A1C0D6B7E5F2A3C8D1E9F0A2B4C6D8E0F2A4B6C8D0E2F4A6B8C0D2"
# Calcular el hash del archivo descargado
$hashArchivo = (Get-FileHash -Path "C:\Downloads\app-installer.exe").Hash
# Comparar (sin distinguir mayúsculas/minúsculas — no importan en hexadecimal)
$hashArchivo -eq $hashOficial
Si el resultado es False, no ejecutes el archivo. Descártalo, limpia la caché del navegador y descárgalo de nuevo — preferentemente desde otra red, para descartar un man-in-the-middle local.
Verificar varios archivos de una carpeta
En contextos de implementación o auditoría, calcular el hash de un directorio entero es más eficiente con Get-ChildItem en pipeline:
# Calcular SHA256 de todos los archivos de una carpeta
Get-ChildItem -Path "C:\Scripts\" -File | Get-FileHash | Format-Table Algorithm, Hash, Path -AutoSize
Para exportar el resultado como CSV — útil para registrar el estado de un directorio en determinada fecha:
Get-ChildItem -Path "C:\Scripts\" -File |
Get-FileHash |
Export-Csv -Path "C:\Auditoria\hashes-$(Get-Date -Format 'yyyyMMdd').csv" -NoTypeInformation
Guarda ese archivo CSV y compáralo con una ejecución futura para detectar cualquier modificación en los scripts — técnica básica de detección de manipulación (file integrity monitoring).
Verificar si dos archivos son idénticos
Antes de reemplazar un archivo de configuración en producción, vale la pena confirmar que el archivo de staging es exactamente el mismo:
$hash1 = (Get-FileHash "C:\Prod\config.json").Hash
$hash2 = (Get-FileHash "C:\Staging\config.json").Hash
if ($hash1 -eq $hash2) {
Write-Host "Archivos idénticos." -ForegroundColor Green
} else {
Write-Host "¡Archivos diferentes!" -ForegroundColor Red
}
Esto elimina el riesgo de "se parecían pero no eran iguales" — una diferencia de un carácter en un JSON de configuración puede tumbar un servicio.
¿Cuándo usar MD5 vs. SHA256?
Usa SHA256 (o superior) para verificación de seguridad. MD5 tiene colisiones conocidas desde 2004 — es técnicamente posible crear dos archivos con contenido distinto y el mismo hash MD5. Para garantizar que un instalador no fue manipulado, eso es inaceptable.
Reserva MD5 para casos donde la velocidad importa más que la garantía criptográfica: comparar copias de backup en almacenamiento interno, deduplicación de archivos de log en una herramienta corporativa que solo acepta MD5. En cualquier contexto donde la integridad es cuestión de seguridad, SHA256 es el mínimo razonable.
¿Por qué SHA1 no es suficiente para seguridad?
En 2017, Google y el CWI demostraron la primera colisión práctica en SHA1 (proyecto SHAttered), produciendo dos PDF distintos con el mismo hash. Desde entonces, SHA1 se considera inadecuado para verificación de integridad en contextos de seguridad. Windows Update, la firma de código de Microsoft y la mayoría de los sistemas modernos de distribución migraron a SHA256 hace años.
Casos de uso reales
- ISOs de Windows: Microsoft publica los hashes SHA256 de cada ISO en el panel de descarga. Calcúlalo antes de grabarlo en el pendrive — una ISO corrupta o manipulada va a generar problemas silenciosos en la instalación.
- Paquetes de software abierto: proyectos como Python, Node.js y Git publican checksums SHA256 junto al release. Verificarlo toma 10 segundos y elimina el riesgo de descargar desde un mirror comprometido.
- Evidencia forense: antes de trabajar sobre una copia de un archivo sospechoso, calcula y registra el hash. Eso garantiza la cadena de custodia — prueba que el archivo no fue modificado desde la recolección.
- Automatización de despliegue: en un script de CI/CD, valida el hash del artefacto antes de subirlo al servidor de producción. Una línea extra que evita implementar un paquete corrupto.
Limitaciones a conocer
Get-FileHash verifica integridad, no autenticidad. Un archivo puede tener el hash correcto y aun así ser malware — si el sitio del fabricante fue comprometido y el hash oficial se cambió junto con el archivo, el cmdlet va a decir "True". Por eso, la verificación de hash complementa, pero no sustituye, el escaneo de antivirus. Para una capa adicional, combínalo con la guía de verificación con VirusTotal antes de ejecutar cualquier instalador desconocido.
Para monitorear cambios en archivos a lo largo del tiempo en producción, soluciones dedicadas de FIM (File Integrity Monitoring) como el módulo de auditoría de archivos de Windows (cubierto en el post sobre auditoría de logs con PowerShell) ofrecen alertas en tiempo real que van más allá de la foto que logra una tarea programada.
Conclusión
Get-FileHash es una de las herramientas más simples y más subutilizadas de PowerShell. Calcular el hash SHA256 de un instalador antes de ejecutarlo toma menos de 10 segundos y elimina toda una categoría de riesgo — archivo corrupto en tránsito, descarga desde un mirror comprometido, manipulación local. Agrégalo a tu checklist de sysadmin junto con Invoke-WebRequest para cerrar el ciclo de descarga-verificación-ejecución en un pipeline coherente.
Si usas Get-FileHash en automatización de despliegue o en forense, los ejemplos de CSV de arriba probablemente ya te dan lo que necesitas. Pero si quieres ampliar hacia monitoreo continuo, el siguiente paso natural es configurar tareas programadas con Get-NetTCPConnection o scripts de auditoría que disparen una alerta por correo cuando el hash cambie.




Comentarios