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秒會替換新的驗證碼