Cálculo de la huella digital (fingerprint) de un archivo.

Para calcular la huella digital (fingerprint) de un archivo, es necesario usar el mismo algoritmo de hash que el utilizado en Belenios. El algoritmo utilizado es SHA-256, pero con el resultado expresado en Base64 sin relleno, en vez de la representación hexadecimal habitual.

En el repositorio https://gitlab.unc.edu.ar/belenios-unc/tools se provee el script fingerprint.py que permite calcular la huella digital de uno o más archivos.

También es posible hacerlo desde la línea de comandos, como en el ejemplo siguiente. Usamos el archivo voters.txt como ejemplo, pero por supuesto, se puede reemplazar por cualquier otro archivo.

sha256sum voters.txt | xxd -p -r | base64 | tr -d "="

(o shasum -a256 en lugar de sha256sum, por ejemplo en MacOS)

En Windows, con PowerShell, el código equivalente es:

# 1. Obtener el hash SHA256 como cadena hexadecimal
$hexHash = (Get-FileHash -Path voters.txt -Algorithm SHA256).Hash

# 2. Convertir la cadena hexadecimal a un array de bytes
#    - Dividimos la cadena en pares de caracteres ('(..)')
#    - Filtramos los elementos vacíos resultantes de la división
#    - Convertimos cada par hexadecimal a un byte
$byteArray = ($hexHash -split '(..)' | Where-Object {$_}) | ForEach-Object { [System.Convert]::ToByte($_, 16) }

# 3. Convertir el array de bytes a Base64 y quitar el padding '='
$base64String = [System.Convert]::ToBase64String($byteArray).TrimEnd('=')

# 4. Mostrar el resultado
Write-Output $base64String

En Python, puede utilizarse un código similar al siguiente:

import base64
from hashlib import sha256

with open("voters.txt", "rb") as f:
    digest = sha256(f.read()).digest()
    encoded = base64.b64encode(digest)
    print(encoded.decode().strip('='))