Excel VBAは言わずもがな強力なツールであるが、ユーザへのアナウンスというかマニュアル作成というか、まぁ使ってもらうためのお膳立て面が面倒だったりする。
そこで、VBAで組んだ機能をワークシート関数化してしまえば、そのファイルの中ではワークシート関数(=sum(A1:A10)の様なのと同じ扱い)として使用可能になる。
場面により使える場合使えない場合があるが、VBAで作り込んだ機能の説明を0から行うよりは、簡単になる場面が多いかと思われる。
今回は引数とした任意のセル範囲の文字列に対するSHA256ハッシュ値を取得する関数をVBAで作成し、ワークシート関数として使用してみたい。
ちなみに標準のワークシート関数では現在のところ文字列のハッシュ値を取得は不可。
標準モジュールに次のコードを追加。
Public Function GetSHA256(ハッシュ値算出範囲 As Range) As String Const LENGTH_OF_HASH = 32 Const LENGTH_OF_HASH_AS_STRING = 64 Set objUTF8 = CreateObject("System.Text.UTF8Encoding") Set objSHA256 = CreateObject("System.Security.Cryptography.SHA256Managed") Dim str As String 'Rangeの文字列結合(ワークシート関数のConcatを流用) str = Application.WorksheetFunction.Concat(ハッシュ値算出範囲) 'バイト読み込み Dim code() As Byte code = objUTF8.GetBytes_4(str) 'ハッシュ値計算 Dim hashValue() As Byte hashValue = objSHA256.ComputeHash_2(code) '16進数へ変換 Dim description As String * LENGTH_OF_HASH_AS_STRING Dim i& For i = 0 To LENGTH_OF_HASH - 1 Mid(description, i * 2 + 1) = Right("0" & Hex(hashValue(i)), 2) Next i 'return GetSHA256 = description End Function
ワークシート側では、任意のセルに「=GetSHA256(A1:B1)」等と記入すればOK。
これで文字列のSHA256ハッシュがシート上で取得できる。
結果はこんな感じ↓。
一見使いどころが見当たらないが、任意のセル範囲の値が変わっているかどうかを簡易に検出するのに、ハッシュ値が使用できると便利なケースがある。
例えば行単位でハッシュ値が変わっていなければ、その行については並びも値も全く変わっていない、等の使い方が可能である。(※
まぁConcat関数でもとんでもない長さの文字列にでもならなければ、実質同じことは可能なわけだが、そこはご愛嬌。
※)SHA-256はSecure Hash Algorithmの一つで、メッセージ(インプット)から固定長のハッシュ値を計算するための暗号学的ハッシュ関数です。ハッシュ値は元のメッセージから導き出されるため、同じメッセージに対しては必ず同じハッシュ値が得られます。
なお、異なるメッセージに対して同じハッシュ値が得られる可能性があることを「衝突」と呼び、SHA-256は衝突耐性を持っています。これは、異なるメッセージから同じハッシュ値が得られることは非常に困難であるとされています。
SHA-256は主に、デジタル署名やデータの整合性チェックに使用されます。たとえば、ファイルのダウンロード時にファイルのSHA-256ハッシュ値を提供することで、ダウンロードしたファイルが改竄されていないことを確認することができます。また、SHA-256はパスワードの保存にも使用されます。パスワードをSHA-256ハッシュ値に変換し、そのハッシュ値を保存することで、元のパスワードを知らなくても、ハッシュ値を比較することでパスワードが一致するかどうかを確認できます。
Excel VBAを使用して、任意のセル範囲の文字列のSHA-256ハッシュ値を取得する関数を作成することで、セル範囲の値が変更されたかどうかを簡単に検出できるようになります。
0 件のコメント:
コメントを投稿