VBA拡張版:OTPを一度使ったら即失効(ワンタイム利用)
ここまでで「OTPに有効期限を設定」する方法を紹介しました。今回はさらに拡張して、OTPを一度使ったら即失効(ワンタイム利用)する仕組みです。これにより、同じコードを再利用されるリスクを完全に防げます。
実現方法の流れ
- OTPを生成(ランダムな数字列)
- 生成時刻とコードを記録
- 管理者が入力したコードをチェック
- 一致すれば「認証成功」→ 即失効(削除またはフラグ更新)
- 不一致なら「認証失敗」
- 再利用不可 → 同じコードは二度使えない
サンプルコード(ワンタイム利用)
Option Explicit
'=== グローバル変数でOTPを保持 ===
Dim currentOTP As String
Dim otpIssuedTime As Date
Dim otpUsed As Boolean
'=== OTP生成関数 ===
Function GenerateOTP(Optional length As Integer = 6) As String
Dim chars As String, i As Integer, result As String
chars = "0123456789"
Randomize
For i = 1 To length
result = result & Mid(chars, Int(Rnd() * Len(chars)) + 1, 1)
Next i
GenerateOTP = result
End Function
'=== OTP送信(メール) ===
Sub SendOTPEmail(toAddress As String, otpCode As String)
Dim objMsg As Object, objConf As Object
Set objMsg = CreateObject("CDO.Message")
Set objConf = CreateObject("CDO.Configuration")
' SMTP設定(例:Office365)
With objConf.Fields
.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "smtp.office365.com"
.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 587
.Item("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = True
.Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1
.Item("http://schemas.microsoft.com/cdo/configuration/sendusername") = "your_account@domain.com"
.Item("http://schemas.microsoft.com/cdo/configuration/sendpassword") = "your_password"
.Update
End With
With objMsg
Set .Configuration = objConf
.From = "your_account@domain.com"
.To = toAddress
.Subject = "【認証コード通知】ZIPパスワード取得用OTP"
.HTMLBody = "<html><body><h2>🔑 認証コード</h2><p><b>" & otpCode & "</b></p><p>※有効期限は5分、かつ一度のみ利用可能です。</p></body></html>"
.Send
End With
End Sub
'=== OTP発行 ===
Sub IssueOTP()
currentOTP = GenerateOTP(6)
otpIssuedTime = Now
otpUsed = False
Call SendOTPEmail("admin@domain.com", currentOTP)
MsgBox "OTPを発行しました(有効期限5分・一度のみ利用可能)", vbInformation
End Sub
'=== OTP認証 ===
Sub VerifyOTP()
Dim userInput As String
' 入力を受け付け
userInput = InputBox("メールで送信された認証コードを入力してください")
' 有効期限チェック
If DateDiff("n", otpIssuedTime, Now) > 5 Then
MsgBox "認証コードの有効期限が切れました。新しいコードを発行してください。", vbExclamation
Exit Sub
End If
' ワンタイム利用チェック
If otpUsed = True Then
MsgBox "この認証コードはすでに使用済みです。新しいコードを発行してください。", vbCritical
Exit Sub
End If
' 一致チェック
If userInput = currentOTP Then
MsgBox "認証成功!パスワードを取得できます", vbInformation
otpUsed = True ' 即失効
' ここでパスワード取得処理を呼び出す
Else
MsgBox "認証失敗!コードが一致しません", vbCritical
End If
End Sub
VBこの拡張版のポイント
- OTPをグローバル変数で管理 → 発行時刻と使用状態を保持
- 有効期限+ワンタイム利用 → 5分以内かつ未使用なら認証可能
- 使用後は即失効 →
otpUsed = Trueにして再利用不可
実務でのメリット
- セキュリティ強化 → OTPは一度しか使えないため不正利用を防止
- 有効期限+ワンタイム利用の二重保護 → 時間制限と利用制限で安全性を最大化
- 完全自動化可能 → タスクスケジューラと組み合わせれば「セキュアZIP+ワンタイムOTP認証」を自動運用
✅ まとめ
- OTPを一度使ったら即失効
- 有効期限(例:5分)+ワンタイム利用で二重のセキュリティ
- 管理者が正しいコードを期限内に入力した場合のみ認証成功


