File this away in your “might come in handy some day” drawer… Here’s a quick PowerShell script to calculate the Base64 SHA256 hash of a file:
param( [Parameter(Mandatory=$True, ValueFromPipeline=$True)] $filePath)
$hasher = [System.Security.Cryptography.SHA256]::Create()$content = Get-Content -Encoding byte $filePath$hash = [System.Convert]::ToBase64String($hasher.ComputeHash($content))Write-Output ($filePath.ToString() + ": " + $hash)You can pipe every file in a directory to this script like this:
ls -File |% {.\Get-FileHash.ps1 $_}C#
Or, if you prefer, a C# example:
using System;using System.IO;using System.Security.Cryptography;
static string Base64SHA256(string filePath){ var hasher = SHA256.Create(); byte[] hashValue; using(Stream s = File.OpenRead(filePath)) { hashValue = hasher.ComputeHash(s); } return Convert.ToBase64String(hashValue);}Python
Finally, the same thing in Python. This function is a bit more involved than the other examples because it takes advantage of Python’s dynamic typing. You can pass it a string or any object with a read attribute. Note that this function relies on the path.py module, though you can remove that dependency pretty easily.
import hashlib, base64from path import path
def calc_sha(obj): """Calculates the base64-encoded SHA hash of a file.""" try: pathfile = path(obj) except UnicodeDecodeError: pathfile = None sha = hashlib.sha256()
if pathfile and pathfile.exists(): return base64.b64encode(pathfile.read_hash('SHA256')) elif isinstance(obj, basestring): sha.update(obj) elif hasattr(obj, 'read'): while True: d = obj.read(8192) if not d: break sha.update(d) else: return None
r = sha.digest() r = base64.b64encode(r) return rThis particular implementation can also be found in my propane utility library (in the filetools module).