ハッシュの仕組みとPowerShellコード例★初心者向け

PowerShell

この記事では、ハッシュとは何か、その用途、そして具体的なPowerShellコードを使って、ハッシュについて説明します。

ハッシュとは?

ハッシュとは、あるデータ(文字列やファイルなど)を固定長のデータに変換するための関数やアルゴリズムのことを指します。この変換の結果を「ハッシュ値」や「ハッシュコード」と呼びます。ハッシュ関数は、同じ入力に対して常に同じ出力を返しますが、異なる入力から同じ出力が得られる可能性は非常に低いです。

ハッシュは以下のような場面でよく使われます。

  • データの一意性の確認:データベースなどで、同じデータが既に存在するかを高速に確認するため。
  • データの整合性チェック:ファイルの破損を検知するために、ファイルのハッシュ値を比較する。
  • パスワードの管理:ユーザーのパスワードをそのまま保存せず、ハッシュ値として保存することでセキュリティを強化する。

ハッシュの仕組み

ハッシュ関数は入力データを数学的に変換して、通常は固定長のバイナリデータ(一般的に16進数表記)に変換します。例えば、入力が「apple」という文字列の場合、SHA-256というハッシュ関数を使うと、次のようなハッシュ値が得られます。

apple -> 3a7bd3e2360a822d3815b95ac5c7c283d2b4b70d64547e0a9a3c78ac1c14cfb1

ハッシュ関数は、一方向性(逆に変換できない)という重要な性質を持っており、ハッシュ値から元のデータを復元することはできません。

コード例:PowerShellでハッシュ値を計算する

具体的にPowerShellを使ってハッシュ値を計算してみます。
PowerShellには、Get-FileHashという便利なコマンドレットが用意されており、これを使ってファイルや文字列のハッシュ値を簡単に計算することができます。

文字列のハッシュ値を計算する

文字列のハッシュ値を計算する方法です。

■PowerShell

# ハッシュ化したい文字列
$string = "apple"

# 文字列をバイト配列に変換
$bytes = [System.Text.Encoding]::UTF8.GetBytes($string)

# SHA256 ハッシュアルゴリズムを使用してハッシュ値を生成
$sha256 = [System.Security.Cryptography.SHA256]::Create()
$hash = $sha256.ComputeHash($bytes)

# ハッシュ値を16進数の文字列に変換して表示
$hashString = [BitConverter]::ToString($hash) -replace '-'
Write-Output "文字列 '$string' のハッシュ値は: $hashString"

このコードは、文字列「apple」をSHA-256アルゴリズムでハッシュ化し、その結果を16進数形式で表示しています。
ハッシュ値は通常、バイナリデータ(0と1のデータの列)として生成されます。バイナリデータは人間にとって読みにくいため、通常は16進数形式で表示します。

■実行結果

文字列 'apple' のハッシュ値は: 3A7BD3E2360A3D29EEA436FCFB7E44C735D117C42D1C1835420B6B9942DD4F1B
参考:
SHA256 クラス (System.Security.Cryptography) | Microsoft Learn

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

ファイルのハッシュ値を計算する方法です。Get-FileHashコマンドレットを使えば、ファイルのハッシュ値を簡単に計算できます。

# ハッシュ化したいファイルのパス
$filePath = "C:\temp\test.txt"

# ファイルのハッシュ値を計算
$fileHash = Get-FileHash -Path $filePath -Algorithm SHA256

# 結果を表示
Write-Output "ファイル '$filePath' のハッシュ値は: $($fileHash.Hash)"

このコードは、指定したファイルのSHA-256ハッシュ値を計算し、その結果を表示します。

■実行結果

ファイル 'C:\temp\test.txt' のハッシュ値は: 3DDCBBE45F7FE030813893161A754558EECCD1DBC02D760CF79A5593E3A2901E
参考:
Get-FileHash

ハッシュの用途

ハッシュがどのように使われるかをもう少し詳しく説明します。

パスワードのハッシュ化

ウェブサイトなどでユーザーのパスワードをそのまま保存することは、セキュリティリスクが非常に高くなります。そこで、パスワードをハッシュ化して保存します。これにより、万が一データベースが流出しても、ハッシュ化されたパスワードから元のパスワードを復元するのは非常に困難です。

PowerShellでも、次のようにパスワードをハッシュ化して保存できます。

# パスワードのハッシュ化
$password = "my_secure_password"

# パスワードをハッシュ化
$hashedPassword = [System.Security.Cryptography.SHA256]::Create().ComputeHash([System.Text.Encoding]::UTF8.GetBytes($password))

# ハッシュ値を16進数の文字列に変換して表示
$hashedPasswordString = [BitConverter]::ToString($hashedPassword) -replace '-'
Write-Output "ハッシュ化されたパスワード: $hashedPasswordString"

■実行結果

ハッシュ化されたパスワード: 2C9A8D02FC17AE77E926D38FE83C3529D6638D1D636379503F0C6400E063445F

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

ファイルが正しく送受信されたかを確認するために、ファイルのハッシュ値を使うことができます。送信前にファイルのハッシュ値を計算し、受信後に再度ハッシュ値を計算して比較することで、ファイルが途中で改ざんされていないかを確認できます。

以下は、ファイルのハッシュ値を計算して整合性をチェックする簡単な例です。

# 送信前のファイルハッシュ値を計算
$originalFilePath = "C:\temp\original\test.txt"
$originalHash = Get-FileHash -Path $originalFilePath -Algorithm SHA256

# 受信後のファイルハッシュ値を計算
$receivedFilePath = "C:\temp\received\test.txt"
$receivedHash = Get-FileHash -Path $receivedFilePath -Algorithm SHA256

# ハッシュ値を比較して整合性を確認
if ($originalHash.Hash -eq $receivedHash.Hash) {
Write-Output "ファイルは改ざんされていません。"
} else {
Write-Output "ファイルが改ざんされました!"
}

■実行結果

ファイルは改ざんされていません。

まとめ

この記事では、ハッシュとは何か、その用途、そして具体的なPowerShellコードを使って、ハッシュについて説明しました。

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