VBA拡張版:OTPの有効期限(例:5分)を設定し、期限切れなら再発行
ここまでで「取得時にワンタイム認証(2FA)を要求する」仕組みを紹介しました。今回はさらに拡張して、OTP(ワンタイムコード)に有効期限を設定し、期限切れなら再発行する仕組みです。これにより、セキュリティをさらに強化できます。
実現方法の流れ
- OTPを生成(ランダムな数字列)
- 生成時刻を記録
- 管理者が入力した時刻と比較
- 期限(例:5分)を過ぎていれば「期限切れ」扱い
- 新しいOTPを再発行して再送信
- 期限内かつ一致すれば認証成功
サンプルコード(メール通知+有効期限チェック)
Option Explicit
'=== 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>以下のコードを入力してください:</p><p><b>" & otpCode & "</b></p><p>※有効期限は5分です。</p></body></html>"
.Send
End With
End Sub
'=== OTP認証フロー(有効期限付き) ===
Sub OTPAuthentication()
Dim otpCode As String, userInput As String
Dim issuedTime As Date
' OTP生成+送信
otpCode = GenerateOTP(6)
issuedTime = Now
Call SendOTPEmail("admin@domain.com", otpCode)
' 管理者入力を待機
userInput = InputBox("メールで送信された認証コードを入力してください(有効期限5分)")
' 有効期限チェック
If DateDiff("n", issuedTime, Now) > 5 Then
MsgBox "認証コードの有効期限が切れました。新しいコードを再発行します。", vbExclamation
' 再発行
Call OTPAuthentication
Exit Sub
End If
' 一致チェック
If userInput = otpCode Then
MsgBox "認証成功!パスワードを取得できます", vbInformation
' ここでパスワード取得処理を呼び出す
Else
MsgBox "認証失敗!コードが一致しません", vbCritical
End If
End Sub
VBこの拡張版のポイント
- 有効期限を設定 →
DateDiff("n", issuedTime, Now)で経過時間を判定 - 期限切れなら再発行 → 再度
OTPAuthenticationを呼び出す - セキュリティ強化 → 使い回しや遅延入力を防止
実務でのメリット
- セキュリティ強化 → OTPが期限切れなら再発行されるため安全性が高い
- 柔軟性 → 管理者が期限内に入力すれば即認証可能
- 完全自動化可能 → タスクスケジューラと組み合わせれば「セキュアZIP+有効期限付きOTP認証」を自動運用
✅ まとめ
- OTPに有効期限(例:5分)を設定
- 期限切れなら再発行して再送信
- 管理者が期限内に正しいコードを入力した場合のみ認証成功


