2FA 雙重驗證 URL格式

2FA URL 格式如下方。透由 Scheme、Type、Label、Parameters 組成。

1
otpauth://TYPE/LABEL?PARAMETERS

一、Scheme

otpauth 期初由Google提出,用於將帳號與雙重驗證綁定,大多驗證格式都會用optauth,例如Google、Microsoft 等等。

二、Type

Type 代表驗證類型,目前有兩種驗證類型,分別為 HOTP 與 TOTP。

HOTP

HOTP 是基於 HMAC-based One-Time Password Algorithm,是一種基於 HMAC 的一次性密碼演算法,主要是透過一個密鑰與計數器產生一個一次性密碼,並且透過驗證計數器是否一致來驗證是否正確。

參考文件 -> 基於雜湊訊息驗證碼的一次性密碼演算法

TOTP

TOTP 是基於 Time-based One-Time Password Algorithm,是一種基於時間的一次性密碼演算法,主要是透過一個密鑰與時間產生一個一次性密碼,並且透過驗證時間是否一致來驗證是否正確。

參考文件 -> 基於時間的一次性密碼演算法

三、Label

Label 代表帳號,通常是使用者帳號,例如電子郵件、帳號等等。

四、Parameters

Parameters 代表參數,主要是透過參數來設定驗證相關資訊,例如密鑰、驗證次數、驗證時間等等。

1. Secret

Secret 代表密鑰,主要是透過密鑰來產生一次性密碼。

2. Counter

Counter 代表驗證次數,主要是透過驗證次數來產生一次性密碼。

3. Period

Period 代表驗證時間,主要是透過驗證時間來產生一次性密碼。

4. Algorithm

Algorithm 代表演算法,主要是透過演算法來產生一次性密碼,目前有兩種演算法,分別為 SHA1 與 SHA256。

5. Digits

Digits 代表驗證碼位數,主要是透過驗證碼位數來產生一次性密碼,目前有兩種驗證碼位數,分別為 6 位數與 8 位數。

6. Issuer

Issuer 代表發行者,主要是透過發行者來產生一次性密碼。

實作

NuGet 安裝

1
Install-Package OtpNet

實作程式碼

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
using System;
using System.Text;
using OtpNet;

namespace ConsoleApp
{
class Program
{
static void Main(string[] args)
{
// 產生密鑰
var secretKey = KeyGeneration.GenerateRandomKey(20);
// 產生驗證碼
var totp = new Totp(secretKey);
// 產生驗證碼
var code = totp.ComputeTotp(DateTime.UtcNow);
// 產生驗證碼 Url
var url = KeyUrl.GetTotpUrl(secretKey, "account", "issuer", 6, OtpHashMode.Sha1);
Console.WriteLine($"secretKey: {Encoding.UTF8.GetString(secretKey)}");

Console.WriteLine($"code: {code}");

Console.WriteLine($"url: {url}");

Console.ReadLine();
}
}
}

參考文件