Excel VBAでSHA-256ハッシュ値からパスワードを生成

みなさんは「パスワードの管理」どのようにしていますか?

色々な方法があると思いますが、私が思いつくのはだいたい次のような感じでしょうか

1. 全部記憶している
2. メモに記録している
3. PCやスマホなどの端末内にデータで保存している
4. クラウド内に保存している(GoogleやFirefoxなどのWebブラウザを含む)
5. パスワード管理ソフトを使っている

「1」が一番すごいと思いますが、同じパスワードを使いまわしていたらダメですよね!
また、同じじゃないけど破られやすいものはダメです!

でも、年々記憶力は悪くなってくるし、覚えなければいけない件数はどんどん増えていきます
どんなものかと、色々とwebで検索してみたけど余計にわからなくなっちゃいました

Excel VBAを活用してパスワード管理に役立つことが出来ないかなと考えてみました。
パスワード管理用のツールを一つ思いついたので紹介していきたいと思います

SHA-256ハッシュ値を使ってパスワードに使える文字列を生成するExcel VBAツールについて紹介します 日頃のパスワード管理でお悩みの方! 是非ご覧ください!

★この記事の内容を元に、下の記事で UserForm を使ったパスワード生成管理ツールを作成しています。是非あわせてご覧ください(ツールはもちろんダウンロードできます)

パスワードに関する注意しなければならない点

辞書攻撃の手法などでパスワードがハッキングされるのを防ぎ、アカウントを安全に保つためには、どうしたらよいでしょうか(細かくあげるときりがないので主なものだけ箇条書きします)

【パスワードの設定】について

1. 複数のアカウントで同じパスワードや秘密の質問と回答を使用しない
2. 16文字以上で設定し、英数字(大、小文字)、特殊記号を1つ以上使用する
3. パスワードに家族、友人、ペットなどの名前を使用しない
4. 生年月日、郵便、住所、電話、カード、車両などの番号を使用しない
5. 単語や推測されやすいパスワードを使用しない(例:1234567890, 987654321, password,adminなど)
6. ほとんどの文字がほぼ同じで類似したパスワード(一部だけ変えて流用)は使用しない
7. 可能な限り2段階認証をオンにする

【管理方法】について

1. マスターパスワードをいくつか覚えておき、他のパスワードはプレーンテキストファイルに保存し、パスワード付き7-Zipやその他のディスク暗号化ソフトで暗号化するか、パスワード管理ソフトでパスワードを管理する
2. 暗号化し、異なる場所にパスワードをバックアップする
3. 重要なパスワードをクラウドに保存しない
4. Webブラウザ(Chrome,FireFox,Safari,など)にパスワードを保存させない
5. 他人のパソコンで重要なアカウントにログインしたり、公共のWi-Fiホットスポット、無料VPN、Webプロキシに接続している場合はログインの操作をしない

「パスワード管理ソフト」はそのサービスの運営者を信用できるかどうかは自己判断です

くるみこ
くるみこ

考えれば考えるほどどうしていいかわからなくなっちゃうよ~(^^;

Excel VBAで強固なパスワードを作ってみよう

強固なパスワードを作るには

管理ソフトを使わない場合、パスワードの設定方法もどうするか悩みますよね
どうしてもいつも使っている番号や文言を使いがちです。それを組み替えたりして使いまわしてしまいがちです。そこで、ハッシュ値を使ってパスワードを作るようにしたらと考えてみました

ハッシュ値とは

「ハッシュ関数 (ハッシュかんすう、英: hash function) あるいは要約関数[1]とは、任意のデータから、別の(多くの場合は短い固定長の)値を得るための操作、または、その様な値を得るための関数のこと。ハッシュ関数から得られた値のことを要約値やハッシュ値または単にハッシュという。 」
「ハッシュ関数は非可逆変換であるため、ハッシュ値から元の値を容易には復元できないという特徴がある。」

引用元:https://ja.wikipedia.org/wiki/ハッシュ関数

【入力値の推測が不可能】
暗号学的ハッシュ関数では、入力値が同じであれば誰が使っても必ず同じハッシュが出力されます。しかし、出力されたハッシュから入力値を推測するのは事実上不可能ということです

くるみこ
くるみこ

【ポイント】
ハッシュ値から元の変数を予測することは不可能

ハッシュ関数は、暗号化や認証など様々なセキュリティ技術の基礎的な要素技術として応用されています。算出法の標準規格も定められていて、古くはMD5やSHA-1などが広く普及していましたが、これらは現在では十分安全でないことが知られ、SHA-2(SHA-256など)への置き換えが進んでいます

入力値が少しでも異なれば、出力されるハッシュは大きく異なります
異なる文字列を入力すれば、必ず異なるハッシュを出力します

SHA-256を使ってみます

これを利用すれば、いままで使いまわしていたパスワードでも組み合わせを変えたりすれば全く推測できないパスワードを生成できるわけですね

【決定した生成までの手順】PW文字列 ⇒ UTF8 ⇒ SHA256 ⇒ Base64
SHA-256は「バイナリ値」です。次の手順でVBAコードを組み立てていきます
・文字列をUTF8にエンコードして「バイト配列」に変換します
・「バイト配列」をSHA256ハッシュ値を計算します「バイナリ値」
・「ハッシュ値」のバイナリから Base64 でエンコードします

【生成例1】PW文字列⇒ UTF8⇒ SHA256⇒ バイナリを16進数文字列に変換

文字列 = kurumico
生成後64文字 = 9c3f4d9603e41f3fe5e2cc89c957cf161771ae46085afdfcf5834e597e3b04fc
文字列 = kurumi
生成後64文字=7ba6d6bbc269f73f3256853eaa87ab1959fb2164b65b277f08fb2809bb7ade49
文字列 =くるみ
生成後64文字=78cef29d6cd148e6afd3493600048b8b2d15b3b8fe1c147f2435305d63d4c942
文字列 =くるみこ
生成後64文字=31e7370a2b23f18256975fd458ea2d7236005382f89d98ba6c92a1197de21e50

くるみこ
くるみこ

おお~! すごい! でも文字って長すぎじゃないの?
それに 数字と小文字の英字だけじゃない!
 なんかたりないなぁ(-_-;)

それじゃぁ、Base64を使ってみるね(^^)

Base64とは、64進数を意味する言葉で、すべてのデータをA–Z, a–z, 0–9 までの62文字と、記号2つ (+, /)の64文字で表すエンコード方式です。ただ、データ長を揃えるためにパディングとして末尾に記号の=を使用するので、厳密にはBase64は、65文字の英数字から表現されます

【生成例2】PW文字列 ⇒ UTF8 ⇒ SHA256 ⇒ Base64

文字列 = kurumico
生成後44文字 = nD9NlgPkHz/l4syJyVfPFhdxrkYIWv389YNOWX47BPw=
文字列 = kurumi
生成後44文字=e6bWu8Jp9z8yVoU+qoerGVn7IWS2Wyd/CPsoCbt63kk=
文字列 =くるみ
生成後44文字=eM7ynWzRSOav00k2AASLiy0Vs7j+HBR/JDUwXWPUyUI=
文字列 =くるみこ
生成後44文字=Mec3Cisj8YJWl1/UWOotcjYAU4L4nZi6bJKhGX3iHlA=

あっ! 大文字と小文字が混ざってるね(^^)
 記号は「/+=」だけだけどさっきよりもいい感じだね(^^)/
 

Excel VBAでSHA-256ハッシュを生成するコード

SHA-256ハッシュを生成するコード本体

Option Explicit
'////////////////////////////////////////////////
'[ツール]-[参照設定]で次を追加しておく
'・Microsoft XML, v6.0(Win8以降の場合)
'////////////////////////////////////////////////
'SHA-256ハッシュ値を生成する関数
Function SHA256(str As String) As String
    Dim objSHA256 As Object
    Dim objUTF8 As Object
    Dim bytes() As Byte
    Dim hash() As Byte
    Dim strSHA As String

    '.NET FrameworkのSystem.Security.Cryptographyライブラリ
    Set objSHA256 = CreateObject("System.Security.Cryptography.SHA256Managed")
    Set objUTF8 = CreateObject("System.Text.UTF8Encoding")

    '文字列をUTF8にエンコード(バイト配列に変換)
    bytes = objUTF8.GetBytes_4(str)

    'SHA-256ハッシュ値を計算(バイナリ)
    hash = objSHA256.ComputeHash_2((bytes))
    'Base64でエンコードする
    strSHA = encodeToBase64(hash) '’’’これだ!!これにする!
    '結果を返す
    SHA256 = strSHA
    
'    Dim i,wk
'    'バイナリを16進数文字列に変換してみるTEST用
'    For i = 1 To UBound(hash) + 1
'        wk = wk & Right("0" & Hex(AscB(MidB(hash, i, 1))), 2)
'    Next i
End Function

「参照設定」方法はこちらの記事を参照してください

・コード内にコメントを入れているので細かい説明は省略します
・「15行目」.NET FrameworkのSystem.Security.Cryptographyライブラリの
  ”System.Security.Cryptography.SHA256Managed”オブジェクトをセット
・「16行目」text文字列を「UTF8」にエンコードするためオブジェクトをセット
・「28行目」以下は、16進数文字列をテストした部分をコメントアウトしています

Base64でエンコードするコードとスタート部分

'スタート用
Sub start1()
    Dim strPW As String 
    strPW = Range("B1").Value
    Range("B2").Value = SHA256(strPW)
End Sub
 
'バイト列をBASE64形式の文字列にエンコードする。
Function encodeToBase64(bytes() As Byte)
    encodeToBase64 = encode("bin.base64", bytes)
End Function
 
'バイト列を指定タイプの文字列にエンコードする。
Function encode(dataType As String, bytes() As Byte)
    Dim oXmlDoc As New DOMDocument60 'Microsoft XML, v6.0が必要
    With oXmlDoc
        .LoadXML ("<root />")
        .DocumentElement.dataType = dataType
        .DocumentElement.nodeTypedValue = bytes
    End With
    encode = Replace(oXmlDoc.DocumentElement.text, vbLf, "")
End Function

エンコード部分のコードは、リンクのコードを一部使用させていただいていますm(_ _)m
https://www.nextdoorwith.info/wp/se/imptech/vba-encode-sample/
「ゆっきー」さんの記事「vbaでのエンコード/デコードのサンプル」

・エンコードには、Microsoft XMLライブラリを使用しています
・「1~6行目」はスタートコードです。「B1」セルのデータを読み込んでスタート
・「B2」セルに生成された44桁の文字列を書き出しています

Excelワークシートを用意します

文字列の設定と結果を出力するシート

・「B1」セルには「=C1&D1&E1」の文字列連結式が入っています
・「B3」~「B8」には「=Left($B$2,A3)」のような計算式が入っています
・「B2」に生成された文字列が反映されると「B3」~「B8」で指定文字列を表示します

ワークシートのイベント部分のコード

'シートを変更(入力)すると動作
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Call start1
End Sub

・ワークシートにこのコードを設定しておくとシートに変更があった場合変換する処理がスタートします(必要ない時にも勝手に動いてしまいます)
・それが嫌な場合は、シートにスタート用のボタンを配置して「start1」を実行するように変更してください

まとめ(おわりに)

まとめと感想など

【パスワード管理について検証】
① 「パスワードの設定」いろいろな方法がありますが、強固なパスワードを使いまわさないことが重要だと感じました
② 「パスワードの管理」については「マスターパスワード」を覚えておき、他のパスワードの管理を徹底する方法が良いと思いました
③ このことから、「SHA-256ハッシュ値」と「Base64」を使って強固なパスワードをExcel VBAで生成する方法を考えました
記事の内容は、こんな感じです(^^)

【ここからが一番重要】
パスワードを単純にハッシュ化したからといって安心できません
例えばハッシュには「引数が同じ場合は戻り値も同じ」という特徴もあるのため、ハッシュ化されたデータが流出しても意味をなさないことがあります
それはどういうことかというと、ハッシュ値の元になっている「パスワードに使ったデータのリスト」が流出した場合です。なぜならパスワード・リストからパスワードをハッシュ化して同じ値を探せばいいからです。つまり「辞書攻撃が使える」ということにもなります
【パスワード・リストの管理】
・「ハッシュパスワード」はハッシュ値の元データ「自分で決めた文字列の複合」と「登録先の名称など」の複合で作成した文字列からです
「マスターパスワード」はこの「自分で決めた文字列」と生成されたハッシュから取り出す「文字数と文字位置」の組み合わせいうことになります(シート参照)
・これだけなら、覚えておくのは容易ですよね(^^ゞ
・ただし「マスターパスワード」の管理には十分気を付けてくださいね

今後の記事について

今回の記事はいかがだったでしょうか。皆さまのお役に立てたなら幸いです(^^;
是非!サンプルファイルをダウンロード出来ますのでそのまま使ってみてください(^^)/


【今後の記事内容はどうしようかなぁ・・・】
・職場で日々の報告に使っている出退勤時刻データの取得について
・高速化した「VlookUp関数」のVBAでの活用法を再検討してみたいと思います
・その他「小ネタいろいろ」などなど・・・・・
・今後これらのどれかについて記事にしていきたいと思います。ご期待ください(^^)/

サンプルファイルをダウンロードできます(下記リンク先へ)

記事で使用したサンプルファイルがダウンロードできるページを設置しています
こちら(このリンク先)からご利用ください