Excelを用いてパスワードマネージャーを作り、パスワードを管理する方法を示します。
このパスワードマネージャーは、パスワードを作成し、保管します。パスワードはコピー&ペーストできるので、タイピングの手間も省けます。
パスワード運用上の問題
インターネットを使っていると、しばしばユーザ登録を求められます。ユーザ登録には、パスワードが必要です。
他人にアカウントを乗っ取られないように、パスワードは強力にしたいものです。しかし、強力なパスワードは、長い桁数を必要とします。
サイトによっては、条件の指定があります。例えば、8桁以上とか、大文字と小文字を使うこととか、記号を入れることなどです。
定期的なパスワードの変更を求められることもあります。そのような場合、直前に使っていたパスワードはたいてい使用禁止です。
全ての場合で異なるパスワードを使ったら、当然覚えられません。通常は、数個のパスワードを使いまわすことになり、かえってセキュリティが低くなります。
最近は、ブラウザがパスワードを覚えてくれます。でも、これが曲者で、ブラウザの履歴を消すときに間違って消してしまうリスクがあります。そうでなくても、PCを買い替えた場合には、再入力が必要になります。つまり、パスワードは、なんらかの形で残しておく必要があります。
パスワードをExcelで管理しよう
ではどうしますか?
パスワード管理する方法には、紙に書き留めておく方法と、電子ファイルで管理する方法が考えられます。本記事で提案するのは後者です。Excelで管理します。
Excelはマクロが使えますので、単に記録するだけでなく、パスワードの作成機能も備えることができます。
パスワード生成機能を備えたパスワードマネージャー
以下、Excelのマクロが使える方を対象とします。マクロを使ったことがない方や「開発」タブが表示されないという方は、こちらの記事をご覧ください。
僕のExcelのバージョンは2019MSO(バージョン2203)64ビットです。お手持ちのバージョンと異なる場合は、記載が違っている箇所があるかもしれません。しかし、ググっていただければ同様の機能が見つかると思います。
- Excelを立ち上げる
- 「F12」キーを押す→「ファイルの種類」で「Excelマクロ有効ブック(*.xlsm)」を選ぶ→デスクトップなどの適当なフォルダに移動→「ファイル名」欄に名前を入力する→「保存」をクリック
ファイル名には、パスワード管理ファイルと悟られない名前をつけることをオススメします。例えば、「Summer2015.xlsm」「西田幾多郎哲学.xlsm」なんて感じはいかがでしょうか。
- 「Alt」キーを1回押す→「paap」とタイプする
これにより、「枠線に合わせる」ように設定されます。(PPAPではありません。念のため)
- 「開発」タブ→「挿入」「ActiveXコントロール」から「チェックボックス」を選び、B2:C3に配置する。同様に、B4:C5、B6:C7、B8:C9、B10:C11にもチェックボックスを配置する
- B2:C3のチェックボックスをダブルクリックするとVisual Basicのエディタが開くので、そのプロパティ欄の「(オブジェクト名)」を「chkNumeric」、「Caption」を「数字」にする
- BackColorの値欄の「□&H80000005&」をクリック→「▼」をクリック→「パレット」をクリック→好きな色を選ぶ
- 同様に、B4:C5を「chkHex」「16進」、B6:C7を「chkUc」「英大文字」、B8:C9を「chkLc」「英小文字」、B10:C11を「chkSymbol」「記号」にする
- 「挿入」「ActiveXコントロール」から「コマンドボタン」を選び、B14:C15に配置する
- コマンドボタンの「(オブジェクト名)」を「cmdExe」、「Caption」を「パスワード生成」にする
- E1:J1に、「日付」「サイト」「ユーザ名」「桁数」「パスワード」「備考」を入力する
- 桁数を入力するH列を選び、好きな色を付ける
- パスワードが生成されるI列を選び、好きな色を付ける
- タイトル欄のE1:J1を選択し、好きな色を付ける
- E:J列を選び、「フォント」→「罫線」→「格子」を選ぶ
- Visual Basicのプロジェクトエクスプローラで、「Sheet1 (Sheet1)」をダブルクリックし、エディタを表示する
- 以下のコードをコピーし、エディタ全面に上書きペーストする
Option Explicit
Private Sub cmdExe_Click()
Const cstColDate As String = "E" ' 日付列
Const cstColDigits As String = "H" ' 桁数列
Const cstColPwd As String = "I" ' パスワード列
Const cstColRemarks As String = "J" ' 備考列
Const cstRowTitle As Long = 1 ' タイトル行
Dim i As Integer ' ループ変数
Dim j As Integer ' ループ変数
Dim intCharsUsed As Integer ' 使用文字数
Dim intTgtRow As Integer ' 対象行
Dim strChars() As String ' 使用文字
Dim strPwd As String ' 生成するパスワード
Dim vrtPwdLen As Variant ' パスワード桁数
' シートの保護を解除する
ActiveSheet.Unprotect
' 当該範囲のセルのロックを解除する
Columns(cstColDate & ":" & cstColRemarks).Locked = False
' チェックが一つ以上入っていることを確認する
If (Me.chkNumeric.Value = False) And _
(Me.chkHex.Value = False) And _
(Me.chkUc.Value = False) And _
(Me.chkLc.Value = False) And _
(Me.chkSymbol.Value = False) Then
MsgBox ("ボックスのいずれかにチェックを入れて下さい")
GoTo PostHandler
End If
' strCharsの0~15にそれぞれ16進数1文字を入れる
ReDim strChars(15)
For i = LBound(strChars) To UBound(strChars)
strChars(i) = Hex(i)
Next i
' 数値又は16進に応じて使う文字範囲を決める
intCharsUsed = 0
If Me.chkNumeric.Value Then intCharsUsed = 10
If Me.chkHex.Value Then intCharsUsed = 16
' 大文字がチェックされていたら26文字加える
If Me.chkUc.Value Then
intCharsUsed = intCharsUsed + 26
' 16進数で重複している場合は除いておく
If Me.chkHex.Value Then
intCharsUsed = intCharsUsed - 6
End If
ReDim Preserve strChars(intCharsUsed - 1)
For i = 1 To 26
strChars(UBound(strChars) - 26 + i) = _
Chr(Asc("A") - 1 + i)
Next i
End If
' 小文字がチェックされていたら26文字加える
If Me.chkLc.Value Then
intCharsUsed = intCharsUsed + 26
ReDim Preserve strChars(intCharsUsed - 1)
For i = 1 To 26
strChars(UBound(strChars) - 26 + i) = _
Chr(Asc("a") - 1 + i)
Next i
End If
' 記号がチェックされていたら32文字加える
If Me.chkSymbol.Value Then
intCharsUsed = intCharsUsed + 15 + 7 + 6 + 4
ReDim Preserve strChars(intCharsUsed - 1)
For i = 1 To 15
strChars(UBound(strChars) - (15 + 7 + 6 + 4) + i) = _
Chr(Asc("!") - 1 + i)
Next i
For i = 1 To 7
strChars(UBound(strChars) - (7 + 6 + 4) + i) = _
Chr(Asc(":") - 1 + i)
Next i
For i = 1 To 6
strChars(UBound(strChars) - (6 + 4) + i) = _
Chr(Asc("[") - 1 + i)
Next i
For i = 1 To 4
strChars(UBound(strChars) - 4 + i) = _
Chr(Asc("{") - 1 + i)
Next i
End If
' 対象行を探す
intTgtRow = Range(cstColDigits & Rows.Count).End(xlUp).Row
' パスワードが空白であることを確認する
If Range(cstColPwd & intTgtRow).Value <> "" Then
Call MsgBox("パスワードは既に設定されています", _
vbOKOnly + vbInformation, "確認")
GoTo PostHandler
End If
' 桁数を取得する
vrtPwdLen = Range(cstColDigits & intTgtRow).Value
' 桁数に異常のないことを確認する
If vrtPwdLen = "" Or _
IsNumeric(vrtPwdLen) = False Or _
InStr(vrtPwdLen, ".") > 0 Or _
Val(vrtPwdLen) <= 0 Then
Call MsgBox("桁数を設定してください", _
vbOKOnly + vbInformation, "確認")
GoTo PostHandler
End If
' パスワードを保持する変数を初期化
strPwd = ""
Randomize
' パスワードを生成する
For i = 1 To vrtPwdLen
strPwd = strPwd & strChars(Int(Rnd() * intCharsUsed))
Next i
' 画面更新を停止する
Application.ScreenUpdating = False
' パスワードを表示する
With Range(cstColPwd & intTgtRow)
.NumberFormatLocal = "@"
.Value = strPwd
End With
' 日付欄に日付がなければ記入する
Range(cstColDate & intTgtRow).Value = Date
For i = cstRowTitle To intTgtRow
For j = Range(cstColDate & intTgtRow).Column To _
Range(cstColRemarks & intTgtRow).Column
If Cells(i, j).Value <> "" Then Cells(i, j).Locked = True
Next j
Next i
' 画面更新を再開する
Application.ScreenUpdating = True
PostHandler:
' 列幅を調節する
Columns.AutoFit
' シートを保護する
ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
End Sub
パスワード生成マクロの使い方
- パスワードに使う文字種類をチェックボックスで選ぶ
英数字を使いたければ、「数字」と「英小文字」を選びます。
選べない場合は、デザインモードになっている可能性があります。
その場合は、「開発」タブ→「コントロール」→「デザインモード」をクリックします。
- パスワードがまだ生成されていない行の桁数欄に数字を入力する
サイト、ユーザ名、備考等は必要に応じて入力してください。
- 「パスワード生成」ボタンをクリック
パスワード欄はロックされますが、値をコピーすることはできます。
生成されたパスワードが気に入らない場合は、「校閲」タブ→「シート保護の解除」をクリックした後、一番下のパスワードを消してから「パスワード生成」ボタンをクリックします。
使用上の注意点
マクロによる保存はさせてはいませんので、ファイルを閉じる前に保存してください。
Excelファイル自体は、以下の手順で暗号化できます。
- 「ファイル」タブ→「情報」→「ブックの保護」→「パスワードを使用して暗号化」
ここで用いるパスワードは、唯一記憶しなければならないパスワードです。ただし、脆弱な保護機能ですので、他人がアクセスできるフォルダに置くことは避けて下さい。例えば、暗号化されないUSBメモリに入れて持ち運んだり、共有フォルダに入れたりすることは絶対に止めましょう。
また、HDDやSSDは、いつ壊れるか分かりませんので、家から持ち出さないようなメディアに、適宜バックアップしてください。
まとめ
パスワードをExcelで生成し、管理する方法を示しました。
普段使っているPCのストレージの片隅に保存できるので、新たな投資は必要ありません。
PCにログインするときのパスワードとファイル名の付け方で最低限のセキュリティは確保できると思います。必要であれば、ファイル自体を暗号化したり、DESやTriple DESを実装したりするなどして、脆弱性に対応いただければと思います。
コメント