Operations Lab.

Archive for 2月 18th, 2013

PowerShell でファイルのハッシュ値を計算する

with one comment

Windows には md5sum や sha1sum といったコマンドが標準では用意されていません。では、MD5 や SHA1 ハッシュを計算することができないかというと、そんな事はありません。PowerShell  を使用すれば割と簡単にハッシュ値を得ることができます。

PowerShell のコマンドレットを使用して MD5 や SHA1 ハッシュを直接計算することはできませんが、.NET Framework のクラスにはハッシュ値を計算できるクラスがありますので、それを使います。具体的には、System.Security.Cryptography 名前空間の MD5 クラスや SHA1 クラスを使用します。

対象となるハッシュアルゴリズムのインスタンスを作成し、ComputeHash メソッドへファイルストリームを渡せばハッシュ値を計算できます。以下のスクリプトは $file に指定したファイルの SHA1 ハッシュ値を計算、表示します。

$file = "C:\Users\Administrator\Downloads\9200.16384.WIN8_RTM.120725-1247_X64FRE_SERVER_EVAL_JA-JP-HRM_SSS_X64FREE_JA-JP_DV5.ISO"
$sha1 = [System.Security.Cryptography.SHA1]::Create()
$stream = New-Object IO.StreamReader $file
$hash = $sha1.ComputeHash($stream.BaseStream)
$stream.Close()
$hs = ""
$hash | %{ $hs += $_.ToString("x2") }
$hs

# <表示例>
# 722a306ac458ec7bdda19706977b749f2c49ebc6

ここでは、Administrator のダウンロードフォルダに保存した、Windows Server 2012 の体験版(ISO ファイル)の SHA1 ハッシュ値を計算しています。

ハッシュアルゴリズムのインスタンスは、Create メソッドで生成します。(Create は Static メソッドです。)ComputeHash メソッドはバイト配列か Stream からハッシュ値を計算します。今回はファイルストリームとして System.IO 名前空間の StreamReader クラスのインスタンスを作成し、それを ComputeHash へ渡しています。

ComputeHash で計算されたハッシュ値($hash)はバイト配列(byte[])を返します。配列の各要素を16進数へ変換し結合することで、ファイルのハッシュ値(ハッシュ文字列)を得ることができます。

日常的に使用するのであれば専用のアプリケーションを導入したほうが効率的ですが、ちょっとハッシュ値を確認したいときや追加でアプリケーションをインストールしたくないときには便利です。

Written by kazu

2013/02/18 at 01:25

カテゴリー: PowerShell

Tagged with ,