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

C#學習筆記

應用所需

1. Visual Studio 2019 - 範例專案 WindowsForm (.net Framework)

目的:

1. 透過Google的Google Authenticator SDK 由代碼產生金鑰

2. 產生的驗證碼可以進行驗證

※用途於登入時進行One Time Password (OTP),等等

範例檔案: https://github.com/gotoa1234/GoogleAuthenticatorExample.git

本篇分為三部分 :

一、 說明Google Authenticator是什麼、用途
二、

使用Google SDK 於代碼中產生金鑰

三、 安裝的APP (Google Authenticator) 產生的驗證碼與代碼產生的一致

 


一、說明Google Authenticator是什麼、用途


Step 1: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-1:產生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 4-2:產生QR Code與加密金鑰的代碼畫面上的執行結果

Step 5-1:以下為產生驗證碼的代碼

1. 最後產生的驗證碼在resultList 中,驗證碼會有多筆,任何一筆都可以驗證成功

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

Step 5-2:以下為產生驗證碼的代碼的執行結果

Step 6:驗證碼是否合法的代碼

/// <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 6-2:驗證碼是否合法的代碼執行結果

Step 7:代碼下載

 


三、安裝的APP (Google Authenticator) 產生的驗證碼與代碼產生的一致


Step 1:拿出手機與程式上的比對,可以發現SecretKey相同時產生的金鑰會一致,而且每隔30秒會替換新的驗證碼