sha256でハッシュ化する関数
SHA-256でハッシュ化するVBAマクロを作成し、シート内で使用できる関数にしました。以下が、そのマクロです。
' SHA-256でハッシュ化する関数
Function SHA256Hash(ByVal inputString As String) As String
Dim xml As Object
Dim hash As Object
Dim bytes() As Byte
Dim hashValue() As Byte
Dim i As Integer
Dim result As String
' MSXML2を利用してSHA256ハッシュを作成
Set xml = CreateObject("MSXML2.DOMDocument.6.0")
Set hash = CreateObject("System.Security.Cryptography.SHA256Managed")
' 文字列をバイト配列に変換
bytes = StrConv(inputString, vbFromUnicode)
' ハッシュを計算
hashValue = hash.ComputeHash_2((bytes))
' バイト配列を16進数文字列に変換
For i = LBound(hashValue) To UBound(hashValue)
result = result & LCase(Right("00" & Hex(hashValue(i)), 2))
Next i
' 結果を返す
SHA256Hash = result
End Function
この SHA256Hash
関数は、渡された文字列を SHA-256 アルゴリズムでハッシュ化し、その結果を16進数形式で返す関数です。以下でコードの詳細を説明します。
関数の構成
Function SHA256Hash(ByVal inputString As String) As String
この関数は、引数 inputString
(ハッシュ化したい文字列)を受け取り、そのハッシュ値を String
型で返します。
変数宣言
Dim xml As Object
Dim hash As Object
Dim bytes() As Byte
Dim hashValue() As Byte
Dim i As Integer
Dim result As String
xml
とhash
は、オブジェクト型の変数です。それぞれ、XMLオブジェクトとSHA-256ハッシュを計算するためのオブジェクトを格納します。bytes()
は、文字列をバイト配列に変換するために使用します。inputString
をバイト列に変換したデータを格納します。hashValue()
は、SHA-256のハッシュ値のバイト配列を格納します。i
はループ用のカウンター変数です。result
は、最終的に生成される16進数のハッシュ値を格納するための文字列です。
オブジェクトの作成
Set xml = CreateObject("MSXML2.DOMDocument.6.0")
Set hash = CreateObject("System.Security.Cryptography.SHA256Managed")
xml
は、XMLオブジェクトを使用して何かを操作しているように見えますが、このコードでは実際には使用されていません。この行は削除しても問題ありません。hash
はSystem.Security.Cryptography.SHA256Managed
を使用してSHA-256のハッシュ計算を行うオブジェクトです。
文字列をバイト配列に変換
bytes = StrConv(inputString, vbFromUnicode)
- この行では、
inputString
をバイト配列に変換しています。StrConv
関数を使い、文字列をUnicode形式のバイト配列に変換しています。
ハッシュ計算
hashValue = hash.ComputeHash_2((bytes))
hash.ComputeHash_2
メソッドを使用して、bytes
(バイト配列)のハッシュを計算し、その結果をhashValue
に格納します。このhashValue
はSHA-256のハッシュ結果をバイト列で保持します。
16進数文字列に変換
For i = LBound(hashValue) To UBound(hashValue)
result = result & LCase(Right("00" & Hex(hashValue(i)), 2))
Next i
- ハッシュのバイト配列(
hashValue
)を1バイトずつループで取り出し、16進数形式の文字列に変換します。 Hex(hashValue(i))
は、そのバイトを16進数に変換します。Right("00" & Hex(hashValue(i)), 2)
によって、常に2桁の16進数で表現されるようにフォーマットします(0埋め)。LCase
関数を使って、16進数のアルファベットをすべて小文字に変換します。- この結果を
result
という文字列に順次連結していきます。
最終結果を返す
SHA256Hash = result
- すべてのバイト列が16進数形式の文字列に変換された後、
SHA256Hash
関数の返り値としてこの結果を返します。
全体の流れ
inputString
(ハッシュ化したい文字列)をバイト配列に変換。- SHA-256でハッシュを計算し、その結果をバイト列で受け取る。
- そのバイト列を16進数の文字列に変換し、結果として返す。
これにより、任意の文字列がSHA-256で安全にハッシュ化され、その結果が文字列として得られます。
使用例
B1セルに「=SHA256Hash(A1)」と入力すると、A1セルの値が、sha256でハッシュ化されて、B1セルに表示されます。