Excel VBA | 実務用 VBA コード集(テンプレ付き)

Excel VBA VBA
スポンサーリンク

VBA拡張版:OTPの有効期限(例:5分)を設定し、期限切れなら再発行

ここまでで「取得時にワンタイム認証(2FA)を要求する」仕組みを紹介しました。今回はさらに拡張して、OTP(ワンタイムコード)に有効期限を設定し、期限切れなら再発行する仕組みです。これにより、セキュリティをさらに強化できます。


実現方法の流れ

  1. OTPを生成(ランダムな数字列)
  2. 生成時刻を記録
  3. 管理者が入力した時刻と比較
    • 期限(例:5分)を過ぎていれば「期限切れ」扱い
    • 新しいOTPを再発行して再送信
  4. 期限内かつ一致すれば認証成功

サンプルコード(メール通知+有効期限チェック)

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分)を設定
  • 期限切れなら再発行して再送信
  • 管理者が期限内に正しいコードを入力した場合のみ認証成功
タイトルとURLをコピーしました