ホームページ  >  記事  >  バックエンド開発  >  Golangを使用してTOTPアルゴリズムを実装する方法

Golangを使用してTOTPアルゴリズムを実装する方法

PHPz
PHPzオリジナル
2023-04-10 09:03:481497ブラウズ

TOTP は時間ベースのワンタイム パスワードであり、セキュリティを強化するために提案された認証方式です。サーバーとクライアントのクロックを使用して短期間のワンタイム パスワードを生成し、ネットワーク送信中にパスワードが傍受されるリスクを回避します。 TOTP アルゴリズムを通じて、クライアントとサーバーの両方が同じトークン値を計算できるため、システムのセキュリティが効果的に確保されます。この記事では、Golang を使用して TOTP アルゴリズムを実装する方法を紹介します。

TOTP アルゴリズムの紹介

TOTP (Time-Based One-Time Password) アルゴリズムは、実際には HOTP アルゴリズムの改良版です。これは RFC 6238 仕様に由来し、時刻同期に基づいたワンタイム パスワード テクノロジです。 TOTP アルゴリズムの基本原理は、事前に設定されたキー、現在時刻、およびその他のパラメーターに基づいて 1 回限りの OTP 応答コードを生成することです。

アルゴリズム全体の基本プロセスは次のとおりです。クライアントは時々新しい OTP を生成し、サーバーも同じアルゴリズムを通じて同じ OTP を生成できます。クライアントとサーバーによって計算された OTP が一致する場合、検証は合格します。そうでない場合、検証は失敗します。

TOTP アルゴリズムのセキュリティは、プリセット キーのランダム性と現在時刻に依存します。したがって、鍵と時間がランダムな場合、TOTP アルゴリズムは高いセキュリティを提供できます。

Golang は TOTP アルゴリズムを実装します

Golang で TOTP アルゴリズムを実装するには、crypto パッケージの HMAC 関数と sha1 パッケージのハッシュ関数を使用する必要があります。 Golang は、SHA1、SHA256 など、一般的に使用されるハッシュ関数を多数提供しているため、実際のニーズに応じて対応するハッシュ関数を選択できます。この記事では、例として SHA1 アルゴリズムを使用して、TOTP アルゴリズムの実装方法を示します。

func TOTPToken(secret string) string {
    key, _ := base32.StdEncoding.DecodeString(secret)
    hash := hmac.New(sha1.New, key)
    hash.Write([]byte(time.Now().UTC().Format("2006-01-02 15:04:05")))
    hmacValue := hash.Sum(nil)

    offset := int(hmacValue[len(hmacValue)-1] & 0xf)
    truncatedHash := hmacValue[offset : offset+4]
    truncatedHash[0] = truncatedHash[0] & 0x7f
    token := fmt.Sprintf("%06d", binary.BigEndian.Uint32(truncatedHash))

    return token
}

上記のコードでは、秘密パラメータはデフォルトのキーであり、標準の Base32 でエンコードされた文字列である必要があります。 TOTPToken 関数では、まずキーをバイト配列キーにデコードし、次に hmac.New 関数を使用して hmac オブジェクトを生成し、現在の UTC 時間を文字列形式で Write メソッドに渡し、ハッシュ値を計算します。その後、4 バイトのフラグメントがハッシュ値からインターセプトされ、OTP 応答コード (truncatedHash) の生成に使用されます。最後に、truncatedHash は 32 ビットの符号なし整数にデコードされ、TOTP アルゴリズムの応答結果として 6 ビットの文字列 (トークン) に変換されます。

TOTP アルゴリズムのテスト

TOTP アルゴリズムを使用する前に、サーバー上のキーと同じキーをユーザーに割り当てる必要があります。サードパーティのライブラリ (Google Authenticator など) を使用してキーを生成し、それを QR コードとして印刷すると、ユーザーは使用時に QR コードをスキャンしてキーを取得できます。

以下は、クライアント側とサーバー側のコードを含む簡単な例です。

クライアント コード:

package main

import (
    "fmt"
)

func main() {
    secret := "MZXW6YTBOI======"
    token := TOTPToken(secret)
    fmt.Println(token)
}

サーバー コード:

package main

import (
    "fmt"
    "net/http"
)

func main() {
    secret := "MZXW6YTBOI======"
    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        w.WriteHeader(http.StatusOK)
        w.Write([]byte(TOTPToken(secret)))
    })

    fmt.Println("Server started at http://localhost:8080")
    http.ListenAndServe(":8080", nil)
}

上記のコードでは、「http」パッケージによって提供される API を使用して単純な Web サーバーを構築しました。 TOTP 応答コードは、http://localhost:8080/totp を要求することで取得できます。また、デバッグ時にアルゴリズムが正しいかテストできるクライアントプログラムも提供しています。

概要

TOTP は、認証のセキュリティを向上させるワンタイム パスワード テクノロジです。この記事では、Golang を使用して TOTP アルゴリズムを実装する方法に焦点を当て、テスト例を示します。このアルゴリズムを習得することで、アプリケーションのセキュリティを強化し、パスワード傍受のリスクを回避できます。

以上がGolangを使用してTOTPアルゴリズムを実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。