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

Excel VBA VBA
スポンサーリンク

VBA拡張版:OTPを一度使ったら即失効(ワンタイム利用)

ここまでで「OTPに有効期限を設定」する方法を紹介しました。今回はさらに拡張して、OTPを一度使ったら即失効(ワンタイム利用)する仕組みです。これにより、同じコードを再利用されるリスクを完全に防げます。


実現方法の流れ

  1. OTPを生成(ランダムな数字列)
  2. 生成時刻とコードを記録
  3. 管理者が入力したコードをチェック
    • 一致すれば「認証成功」→ 即失効(削除またはフラグ更新)
    • 不一致なら「認証失敗」
  4. 再利用不可 → 同じコードは二度使えない

サンプルコード(ワンタイム利用)

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分)+ワンタイム利用で二重のセキュリティ
  • 管理者が正しいコードを期限内に入力した場合のみ認証成功
タイトルとURLをコピーしました