最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Golang實現(xiàn)基于時間的一次性密碼TOTP

 更新時間:2023年11月07日 08:36:24   作者:路多辛  
基于時間的一次性密碼 TOTP 是 OTP 的一種實現(xiàn)方式,這種方法的優(yōu)點是不依賴網(wǎng)絡,因此即使在沒有網(wǎng)絡的情況下,用戶也可以生成密碼,下面我們就來看看如何使用golang實現(xiàn)一次性密碼TOTP吧

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

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

為用戶生成 TOTP Key

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

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

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

Issuer 意思是應用名稱,例如 Github。

AccountName 意思要給哪個用戶生成 key。

Period 意思是 TOTP 密碼的有效時間,也是不同 TOTP 密碼的生成時間間隔,一般為 30 秒。

Digits 意思是生成的密碼長度,一般為 6 位。

Algorithm,用于 HMAC 簽名的算法,默認是 SHA1。

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

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

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

為用戶提供“恢復碼” Recovery Codes

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

校驗用戶輸入的 TOTP 密碼

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

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

模擬生成密鑰、校驗密碼的代碼

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)
    }
 
    // 驗證一次性密碼
    valid := totp.Validate(passcode, key.Secret())
    if valid {
        fmt.Println("Valid passcode!")
    } else {
        fmt.Println("Invalid passcode!")
    }
}

到此這篇關于Golang實現(xiàn)基于時間的一次性密碼TOTP的文章就介紹到這了,更多相關Go一次性密碼內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Golang你一定要懂的連接池實現(xiàn)

    Golang你一定要懂的連接池實現(xiàn)

    這篇文章主要介紹了Golang你一定要懂的連接池實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-08-08
  • Golang中錯誤處理機制詳解

    Golang中錯誤處理機制詳解

    平時在項目開發(fā)過程中少不了對錯誤的處理,一個好用的系統(tǒng)首先要確保其健壯性,不能經(jīng)常發(fā)生錯誤就卡死之類的情況,為了讓我們的程序更加健壯,我們就需要知道golang里的錯誤處理機制是怎么樣的,這篇文章帶大家一起學習,需要的朋友跟著小編一起來看看吧
    2024-05-05
  • golang?pprof?監(jiān)控系列?go?trace統(tǒng)計原理與使用解析

    golang?pprof?監(jiān)控系列?go?trace統(tǒng)計原理與使用解析

    這篇文章主要為大家介紹了golang?pprof?監(jiān)控系列?go?trace統(tǒng)計原理與使用解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-04-04
  • 淺談Golang的Work Stealing機制

    淺談Golang的Work Stealing機制

    Go的運行時系統(tǒng)使用了一種名為Work Stealing的調(diào)度策略來分配Goroutine到可用線程上執(zhí)行,本文主要介紹了淺談Golang的Work Stealing機制,具有一定的參考價值,感興趣的可以了解一下
    2025-03-03
  • Go語言對接微信支付與退款指南(示例詳解)

    Go語言對接微信支付與退款指南(示例詳解)

    在互聯(lián)網(wǎng)技術日益發(fā)展的背景下,Go語言憑借并發(fā)處理能力,在后端開發(fā)中大放異彩,本文詳細介紹如何使用Go語言對接微信支付,完成支付和退款功能,包括準備工作、初始化微信支付客戶端、實現(xiàn)支付功能,以及處理支付回調(diào)和退款等
    2024-10-10
  • go語言中os包的用法實戰(zhàn)大全

    go語言中os包的用法實戰(zhàn)大全

    Go在os中提供了文件的基本操作,包括通常意義的打開、創(chuàng)建、讀寫等操作,除此以外為了追求便捷以及性能上,Go還在io/ioutil以及bufio提供一些其他函數(shù)供開發(fā)者使用,這篇文章主要給大家介紹了關于go語言中os包用法的相關資料,需要的朋友可以參考下
    2024-02-02
  • Golang時間比較的幾種方法小結

    Golang時間比較的幾種方法小結

    本文主要介紹了Golang時間比較的幾種方法小結,包括Before、 After、 Equal, 但是都需要轉成time類型來比較,下面就一起來了解一下,感興趣的可以了解游戲
    2025-06-06
  • Go 并發(fā)控制 errgroup.Group的實現(xiàn)示例

    Go 并發(fā)控制 errgroup.Group的實現(xiàn)示例

    本文主要介紹了Go 并發(fā)控制 errgroup.Group的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2026-04-04
  • 300行代碼實現(xiàn)go語言即時通訊聊天室

    300行代碼實現(xiàn)go語言即時通訊聊天室

    本文主要介紹了300行代碼實現(xiàn)go語言即時通訊聊天室,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-05-05
  • go語言代碼生成器code?generator使用示例介紹

    go語言代碼生成器code?generator使用示例介紹

    這篇文章主要為大家介紹了go語言代碼生成器code?generator的使用簡單介紹,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-05-05

最新評論

铅山县| 加查县| 郸城县| 岫岩| 万安县| 曲麻莱县| 乐业县| 陵水| 沙坪坝区| 渝中区| 嵊州市| 三亚市| 新巴尔虎左旗| 绿春县| 共和县| 莎车县| 罗江县| 乌拉特后旗| 阿克| 枣庄市| 崇明县| 兴业县| 大理市| 仲巴县| 琼海市| 六枝特区| 古丈县| 依安县| 绥阳县| 通河县| 顺平县| 怀宁县| 祁阳县| 雷波县| 文昌市| 南开区| 大田县| 延津县| 榆树市| 吉林省| 文化|