tyler butler

Base64 Encoded SHA256 Hashes

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:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
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:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
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.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import hashlib, base64
from 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 r

This particular implementation can also be found in my propane utility library (in the filetools module).

Comments

comments powered by Disqus