PowerShellでファイルの整合性をチェック

この記事は以前にdevslife.comで公開したものです。

よくファイルをダウンロードするときにファイルの情報に関して表示されているところにMD5というのを目にすることがある。そしてその近くに数字とアルファベットの暗号のような文字列が並んでいるのを目にすることがあるだろう。技術系の方ならご存知だろうと思うが、それぞれのファイルには「指紋」があり、1バイトのデータが違っただけでもその指紋が変わってしまう。これを英語でハッシュ(Hash)という。ハッシュをファイルから取り出すにはいくつかのアルゴリズムがありMD5やSHA1やSHA256などというのがある。

つい最近Sunによって買収されたMySQLのダウンロードページにはそれぞれのファイルにMD5のハッシュ記号が書かれている。

例えばWindows ZIP/Setup.EXE (x86)をダウンロードしてそのファイルにMD5のアルゴリズムでハッシュを生成してやると809e1efe69dc1ed255d0e24421f0d096という文字列が得られるという意味なのだ。逆に言えばMD5でハッシュを生成してその文字列にならなければダウンロードされたファイルがサーバ側にあったファイルとは違い問題があるということになる。さらにダウンロードしているときに悪意のある人がそのファイルにウィルスを入れたかもしれないということも考えられる。そういった意味でハッシュを使ってファイルの整合性を確認することは大切である。

そこでPowerShellを使ってそれをやってみようと思う。

param
(
    $filePath,
    [string] $hash
)
 
$h = [System.Security.Cryptography.MD5]::Create()
 
$inputStream = New-Object IO.StreamReader $filePath
$hashBytes = $h.ComputeHash($inputStream.BaseStream)
$inputStream.Close()
 
$builder = New-Object System.Text.StringBuilder
$hashBytes | Foreach-Object { [void] $builder.Append($_.ToString("X2")) }
 
if ($builder.ToString().ToLower() -eq $hash.ToLower())
{
    return "Good!"
}
else
{
    return "Bad!"
}

上のコードをファイルに保存して下のようにして実行してみよう。(set-executionpolicyを忘れずに。)

こうしてファイルの整合性が確認された。もちろんMD5や他のアルゴリズムでファイルの整合性を確認するツールはあちこちにあるが、PowerShellが使えるのだから別にそういうのをダウンロードする必要もないと思う。上のコードをちょっと変えればSHA1やSHA256のようなアルゴリズムでの整合性の確認はすぐにできてしまう。逆にコンピュータに存在するファイルのハッシュの生成にも使える。dirを使ってファイルをリストしその結果に対してMD5のハッシュを一気に生成するということも簡単にできてしまいそうだ。

コメント

  1. hiro より:

    >もちろんMD5や他のアルゴリズムでファイルの整合性を確認するツールはあちこちにあるが、PowerShellが使えるのだから別にそういうのをダウンロードする必要もないと思う。

    確かにその通りですね。

    今回の例題で勉強させていただきました。
    やはり.NET Frameworkを使用できるってところが可能性を広げてくれますね。

タイトルとURLをコピーしました