日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

上篇文章詳細(xì)講解了一次性密碼 OTP 相關(guān)的知識,基于時間的一次性密碼 TOTP 是 OTP 的一種實(shí)現(xiàn)方式。這種方法的優(yōu)點(diǎn)是不依賴網(wǎng)絡(luò),因此即使在沒有網(wǎng)絡(luò)的情況下,用戶也可以生成密碼。所以這種方式被許多流行的網(wǎng)站使用到雙因子或多因子認(rèn)證中,包括 google、Github、Facebook 和 Salesforce 等等。

因?yàn)?TOTP 是標(biāo)準(zhǔn)化的協(xié)議并且被廣泛采用,所以有很多對應(yīng)的移動應(yīng)用或者 web 應(yīng)用實(shí)現(xiàn),被稱為身份驗(yàn)證器應(yīng)用,例如 Google Authenticator、Microsoft Authenticator 等。Golang 也有很多優(yōu)秀的三方庫可以幫助我們快速實(shí)現(xiàn) TOTP 的服務(wù)端實(shí)現(xiàn),其中比較有代表性的是 pquerna/otp 庫,接下來就使用這個庫來演示一下 TOTP 的服務(wù)端實(shí)現(xiàn)流程。

為用戶生成 TOTP Key

用戶開啟雙因子認(rèn)證時,為用戶生成 TOTP Key,用于生成 TOTP 密碼。將這個密碼保存在數(shù)據(jù)庫或者秘鑰管理系統(tǒng)中,生成 key 的關(guān)鍵代碼如下:

key, err := totp.Generate(totp.GenerateOpts{
		Issuer:      "Github",
		AccountName: "user@example.com",
		Period:      30,
		Digits:      otp.DigitsSix,
    Algorithm: otp.AlgorithmSHA1,
	})

這幾個參數(shù)的意思如下:

  • Issuer 意思是應(yīng)用名稱,例如 Github。
  • AccountName 意思要給哪個用戶生成 key。
  • Period 意思是 TOTP 密碼的有效時間,也是不同 TOTP 密碼的生成時間間隔,一般為 30 秒。
  • Digits 意思是生成的密碼長度,一般為 6 位。
  • Algorithm,用于 Hmac 簽名的算法,默認(rèn)是 SHA1。

把密鑰和密碼生成規(guī)則分享給用戶

通常是將秘鑰和密碼規(guī)則信息以二維碼的形式展示給用戶,用戶使用身份驗(yàn)證器應(yīng)用掃描二維碼保存相關(guān)信息并且生成密碼。二維碼中的內(nèi)容格式一般如下:

otpauth://totp/Github:user@example.com?algorithm=SHA1&digits=6&issuer=Github&period=30&secret=5RLOAFJOB6LRV7WOKFIMDZ5IESZ7L3JM

為用戶提供“恢復(fù)碼” Recovery Codes

生成“恢復(fù)碼” Recovery Codes (使用隨機(jī)生成的字符串即可)存儲到數(shù)據(jù)庫或者秘鑰管理系統(tǒng)中。當(dāng)用戶不能訪問自己的 TOTP 設(shè)備(例如將 TOTP 應(yīng)用中的 TOTP 秘鑰刪除了、將 TOTP 應(yīng)用卸載了、手機(jī)丟失了等)時,就無法登錄自己的帳戶了。因?yàn)檫@種情況比較常見,所以很多網(wǎng)站都會給用戶提供“備份代碼”或“恢復(fù)代碼”,并且每個只能使用一次,可以臨時用來代替 TOTP 密碼。

校驗(yàn)用戶輸入的 TOTP 密碼

用戶再次登錄后,觸發(fā)雙因子認(rèn)證,要求用戶輸入 TOTP 密碼,服務(wù)端檢驗(yàn)這個密碼。校驗(yàn)的關(guān)鍵代碼如下:

// 驗(yàn)證一次性密碼
isValid := totp.Validate(passcode, key.Secret())

模擬生成密鑰、校驗(yàn)密碼的代碼

package mAIn

import (
	"fmt"
	"time"

	"github.com/pquerna/otp"
	"github.com/pquerna/otp/totp"
)

func main() {
	// 生成密鑰
	key, err := totp.Generate(totp.GenerateOpts{
		Issuer:      "Github",
		AccountName: "user@example.com",
		Period:      30,
		Digits:      otp.DigitsSix,
		Algorithm:   otp.AlgorithmSHA1,
	})
	if err != nil {
		panic(err)
	}

	fmt.Println("Secret URL: ", key.URL())

	// 模擬生成一個一次性密碼
	now := time.Now()
	passcode, err := totp.GenerateCode(key.Secret(), now)
	if err != nil {
		panic(err)
	}

	// 驗(yàn)證一次性密碼
	valid := totp.Validate(passcode, key.Secret())
	if valid {
		fmt.Println("Valid passcode!")
	} else {
		fmt.Println("Invalid passcode!")
	}
}

分享到:
標(biāo)簽:Golang
用戶無頭像

網(wǎng)友整理

注冊時間:

網(wǎng)站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學(xué)四六

運(yùn)動步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績評定2018-06-03

通用課目體育訓(xùn)練成績評定