Windows標準機能だけで確認できる
ファイルが変更されたかどうかを確認するアプリはいろいろありますが、今回は追加でアプリやソフトを使わずに、Windows標準の機能だけで確認しようというのが今回の重要ポイントです。
なぜWindows標準縛りをするかというと、お客様先で作業する場合などはアプリやソフトのインストールができないケースが多いためです。
どういうシーンで使う?
ケース1:誰かがこっそりファイルを変更していないか確認する
バージョン管理ができない共有ファイルサーバーなどで不特定多数の人でファイルをやり取りしているとありがちなパターンです。
システム開発屋的にはGitとか使って欲しいと思うのですが、非エンジニアからするとGitは敷居が高いようでなかなか使ってくれません。
最近、私の困った事例を1つ紹介します。
ファイルサーバーに提出したエクセルファイルが複数の部署を回っていった時に最終チェック者から「これ間違ってない?」と言われたのですが、そんなはずはない。
ただ、自分の手を離れてしまうとどこでどう内容を変更されるかわからないものです。きちんと更新履歴を書くルールだったとしても、人間ですから忘れる場合もありますし、悪意を持って改ざんしようとした場合には敢えて更新履歴には書かないでしょう。
そんな時はこれから紹介する方法でファイルが変更されたかどうか簡単に確認できますので是非試してみてください。
ケース2:インターネットからダウンロードしたファイルが正しいか確認する
インターネットでアプリやソフトウェアをダウンロードできるサイトなどで、ダウンロードリンクと一緒にハッシュ値を掲載しているところがあります。
例えば、無料で高機能な画像編集・処理ソフトで有名な「Gimp」のダウンロードページです(2023/10/01時点)。
このダウンロード画面を下にスクロールすると、次のような記載があります。
よくこのような謎の文字列が一緒に記載されていることがあります。SHA256と記載があったり、MD5という記載になっていたりします。
これの謎の文字列のは、ダウンロードしたファイルや、どこからか入手した同名ファイルが本当に正しいファイルなのか検証するために使用する文字列です。
ファイルが同じものか確認するには?
ファイルが2つある時に、あなたはどうやってこの2つのファイルが同じものなのか、違うものなのか判断していますか?
- ファイル名が同じなら、同じファイルなんじゃない?
- ファイルのタイムスタンプ(日時)が同じなら同じファイルなんじゃない?
- ファイルのサイズが同じなら同じファイルなんじゃない?
目視で確認するとしたら、この辺りかなと思います。
しかし、それぞれ次の観点で見ると確認方法として不十分であることがわかります。
- エクスプローラーで名前を変更すればすぐに偽ファイルが作れます。
- タイムスタンプはWindows標準のままでは変更できないため、信ぴょう性がありそうですが、タイムスタンプ変更ツールを使えばファイルの日付は自由に変更できます。
- サイズは目視で確認するには一番てっとり早くファイルの変更が見分けやすいです。なぜならファイルのサイズはそのファイルの物理的なデータの長さであるため、これはなかなか変更しづらいので、オリジナルのファイルとファイルサイズが異なる場合は高確率で変更されていると判断してよいですが、変更した結果が同じファイルサイズになる可能性がゼロではないので、完全ではありません。
つまり、目視では2つのファイルが同じものである、という保証はできません。
では、どうやって判断すればよいのでしょうか?
安心してください。
そこで出番なのがさきほどの謎の文字列です。この謎の文字列の正体はハッシュ値というもので、このハッシュ値を確認することで同じファイルかどうかを完璧に判定することができます。
ファイルのハッシュ値を確認する方法
それでは、さっそくハッシュ値で確認する方法を紹介していきます。
その前にまずハッシュ値ってなに?というところを説明します。これが頭に入っていないとこの先の説明がよく分からなくなってしまいます。
ファイルは1つのデータの塊であるため、そのデータのハッシュ値(指紋)を取ることができ、それを確認することでデータがオリジナルから変更されたかどうかを確認することができます。
では、そのハッシュ値(指紋)はどうやって取るのか?
さっそくやっていきましょう。
PowerShellのGet-FileHashコマンドを使う
Windowsであれば標準でインストールされているPowerShellのGet-FileHashコマンドを使うことで簡単にハッシュ値を確認することができます。
PowerShellを起動
Windowsの検索フィールドに「powershell」と入力(①)します。候補でWindows PowerShellが表示される(②)ので、クリックします。
Get-FileHashコマンド実行
PowerShellが起動したら、Get-FileHashコマンドを実行します。
この時、コマンド名の後に半角スペースを入れてから、ハッシュ値を知りたいファイルを指定します。
PS> Get-FileHash ファイル名
実際に試してみます。
ハッシュ値を知りたいファイルを用意します。今回は適当にエクセルファイルと画像ファイルをそれぞれ1つずつ用意しました。
このファイルが格納されているフォルダにPowerShellウインドウ側で開きます。
今回はFドライブのhashフォルダの中のファイルを対象にするので、カレントフォルダを移動します。
- f: でFドライブに移動しています
- cd hash でFドライブの hashフォルダの中に移動しています
- dir コマンドでhashフォルダの中に格納されているファイルの一覧を表示しています
PS C:\> f:
PS F:\> cd hash
PS F:\hash>
PS F:\hash> dir
ディレクトリ: F:\hash
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 2020/12/08 (火) 8:53 154250 battan-header-summer.jpg
-a---- 2023/10/07 (土) 11:43 8881 WordPressメニュー.xlsx
移動したら、ハッシュ値を表示します。Wordpressメニュー.xlsxファイルのハッシュ値を表示する場合は次のように実行します。
SHA256というアルゴリズムを使って算出したハッシュ値がHash欄に表示されましたね。
PS F:\hash> get-filehash WordPressメニュー.xlsx
Algorithm Hash Path
--------- ---- ----
SHA256 C03744FEB11C3EF0AF1048FB616D98E0CF47C343F7ADA411783D837E690F2B25 F:\hash\Wordpressメニュー.xlsx
Get-Hashコマンドの便利な使い方
複数のファイルのハッシュ値をまとめて表示する
ファイルがたくさんある時、1つひとつファイル名を指定するのは面倒ですよね。そんな時は、ワイルドカードを使って複数ファイルを一回で指定することができます。
次の例では、すべてのファイルを示す(*)を使っています。同じフォルダに格納しているすべてのファイルを指定できるので、次のように全ファイルのハッシュ値を一回で表示することができます。
PS F:\hash> get-filehash *
Algorithm Hash Path
--------- ---- ----
SHA256 4222E6797D6518F047700EABE740DA9460DAF8CB675D726641E83A988A3CB4D3 F:\hash\battan-header-summer.jpg
SHA256 C03744FEB11C3EF0AF1048FB616D98E0CF47C343F7ADA411783D837E690F2B25 F:\hash\Wordpressメニュー.xlsx
ハッシュ値をファイルに出力する
画面に表示されるハッシュ値の情報をファイルにそのまま保存する方法もあります。
次のように最後にリダイレクト(>)を付けてファイル名を指定すると、画面に表示される内容をそのまま指定したファイルに出力することができます。
PS F:\hash> get-filehash WordPressメニュー.xlsx > file-hash.txt
Message Digest 5(MD5)で表示する
ハッシュ値算出時のアルゴリズム(計算方法)ですが、最近ではSHA-256が主流です。ただ、まだ古いMD5アルゴリズムで算出したハッシュ値を使っているしたり、掲載しているサイトがあります。
もちろん、このGet-FileHashコマンドでMD5のハッシュ値を表示することができます。その場合は、次のようにアルゴリズムの指定(-algorithm md5)を追加します。
PS F:\hash> get-filehash -algorithm md5 WordPressメニュー.xlsx
Algorithm Hash Path
--------- ---- ----
MD5 0E00126ED81B87A2DCEF73942AED1ED1 F:\hash\Wordpressメニュー.xlsx
(オマケ)本当にハッシュ値って変わるの?
世間一般で広く使われており、ここは疑う余地はないのですが、一応試してみましょうか。百聞は一見にしかず。
さきほどのエクセルファイルの中身を編集してみます。左が元のファイル。右は左をコピーしてファイル名を変更し、内容をちょっと変更しました(赤字の部分)
さて、この2つのファイルのハッシュ値を表示して確認してみましょう。
PS F:\hash> get-filehash *.xlsx
Algorithm Hash Path
--------- ---- ----
SHA256 C03744FEB11C3EF0AF1048FB616D98E0CF47C343F7ADA411783D837E690F2B25 F:\hash\Wordpressメニュー.xlsx
SHA256 5112546ACCC59685743C03062C0863E4045A86297B28AD8E629E3A6833148D9E F:\hash\Wordpressメニュー2.xlsx
ハッシュ値がまったく異なりますね。仮にファイル名が同じだったとしてもファイルの中身からハッシュ値を計算するので、このように別の値になります。
つまりファイルの内容が変更されている、ということがわかります。
まとめ
Get-FileHashコマンドはどうでしたか?
Lunixは最初からMD5を算出するコマンドがあったのですが、WindowsではPowerShellが導入されるまでハッシュ値を計算することができずCygwin入れてmd5sum使ったりと不便でしたが、だいぶ便利になりました。
今回のようにファイルが変更されたどうかを確認する場合、他にもファイルの中身をすべて比較してくれるコマンドもありますが、対象のファイルサイズが大きくなると時間がかかってしまいます。
ファイルサイズが大きいファイルの場合はハッシュ値を確認した方が速いでしょう。
また、ハッシュ値で確認する方法であれば、比較対象のファイルが手元になくても比較ができます。最初に紹介したダウンロードサイトで配布しているファイルが正しいかどうかのハッシュ値はこのケースに該当します。
コメント