首頁

目前文章總數:157 篇

  

最後更新:2024年 12月 07日

0027. Google驗證器,Google Authenticator 產生金鑰、驗證範例

日期:2020年 10月 28日

標籤: C# Asp.NET Framework Windows Forms Google Authenticator OTP

摘要:C# 學習筆記


應用所需: Visual Studio 2019 - 範例專案 WindowsForm (.net Framework)
解決問題: 1. 透過Google的Google Authenticator SDK 由代碼產生金鑰
     2. 產生的驗證碼可以進行驗證
     ※用途於登入時進行One Time Password (OTP),等等
範例檔案:連結
實作必須:1. Google Gmail 的信箱
     2. Twilio帳號
基本介紹:本篇分為3大部分。
第一部分:說明Google Authenticator是什麼、用途
第二部分:使用Google SDK 於代碼中產生金鑰
第三部分:安裝的APP (Google Authenticator) 產生的驗證碼與代碼產生的一致






第一部分:說明Google Authenticator是什麼、用途

Step 1:Google Authenticator

Google Authenticator 是Google的OTP驗證器,可以用手機於Google Play 商店下載


Step 2: 安裝完成

如果有加入金鑰約每隔30秒會產生一次新的OTP驗證碼


Step 3: 加入金鑰

加入金鑰的方式可以用 “手動輸入” 或 “掃描QR Code”


Step 4: 典型使用情況

說明出處: Wiki
重點: 開發者的網站需要提供用戶一組金鑰,此金鑰開發者也必須記錄,未來用戶登入時驗證兩邊的驗證碼是否一致




第二部分:使用Google SDK 於代碼中產生金鑰

Step 1: 建立新專案

開啟Visual Studio 建立一個新專案(這邊使用Windows Form作為範例) -> 加入參考


Step 2: 輸入 google.Authenticator

安裝


Step 3: 引用Google SDK

using Google.Authenticator;



Step 4: 產生QR Code與加密金鑰的代碼

其中TwoFactorAuthenticator Class 是Google SDK 的物件
1. Account 是自己設定,會影響產生的手動金鑰 ManualEntryKey 與 QR Code
2. Secret Key 是自己設定,會影響產生的手動金鑰 ManualEntryKey 與 QR Code
3. ManualEntryKey 由上面兩個參數產生

/// <summary>
/// 產生QR Code 與 加密金鑰
/// </summary>
public void CreateSecretKeyAndQrCode()
{
    TwoFactorAuthenticator tfA = new TwoFactorAuthenticator();
    var setupCode = tfA.GenerateSetupCode(textBox_account.Text, textBox_account.Text, textBox_SecretKey.Text, false, 3);

    //1. QRCode圖片從記憶體轉到畫面上
    using (MemoryStream ms = new MemoryStream(Convert.FromBase64String(setupCode.QrCodeSetupImageUrl.Replace("data:image/png;base64,", ""))))
        pictureBox_QRCode.Image = Image.FromStream(ms);

    //2. 產生的金鑰與資訊
    this.textBox_Message.Text =
       "結合密鑰的文字 Account: " + textBox_account.Text + System.Environment.NewLine +
       "自已加密的密鑰 Secret Key: " + textBox_SecretKey.Text + System.Environment.NewLine +
       "手動輸入的密鑰 Encoded Key: " + setupCode.ManualEntryKey;
}



Step 5: 執行結果

產生QR Code與加密金鑰的代碼畫面


Step 6: 產生驗證碼的代碼

/// <summary>
/// 產生Secret當前的驗證碼
/// </summary>
public List<string> GeneratorCurrentCode()
{
    var resultArray = new TwoFactorAuthenticator().GetCurrentPINs(textBox_SecretKey.Text);
    var resultList = new List<string>(resultArray);
    return resultList;
}



Step 7: 執行結果

以下為產生驗證碼的代碼的執行結果


Step 8: 驗證碼是否合法的代碼-1

/// <summary>
/// 驗證碼是否正確
/// </summary>
/// <returns></returns>
public string ValidateGoogleAuthCode()
{
    var isRight = false;
    TwoFactorAuthenticator tfA = new TwoFactorAuthenticator();
    isRight = tfA.ValidateTwoFactorPIN(textBox_SecretKey.Text, textBox_ValidateCode.Text);
    return isRight ? "驗證正確" : "錯誤";
}



Step 9: 驗證碼是否合法的代碼-2

以下為產生驗證碼的代碼的執行結果




第三部分:安裝的APP (Google Authenticator) 產生的驗證碼與代碼產生的一致

Step 1: 拿出手機與程式比對

可以發現SecretKey相同時產生的金鑰會一致,而且每隔30秒會替換新的驗證碼