Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk melaksanakan algoritma TOTP menggunakan Golang

Bagaimana untuk melaksanakan algoritma TOTP menggunakan Golang

PHPz
PHPzasal
2023-04-10 09:03:481507semak imbas

TOTP ialah kata laluan satu masa berasaskan masa, kaedah pengesahan yang dicadangkan untuk meningkatkan keselamatan. Ia menggunakan jam pelayan dan pelanggan untuk menjana kata laluan jangka pendek, sekali sahaja, dengan itu mengelakkan risiko kata laluan dipintas semasa penghantaran rangkaian. Melalui algoritma TOTP, kedua-dua pelanggan dan pelayan boleh mengira nilai token yang sama, sekali gus memastikan keselamatan sistem dengan berkesan. Artikel ini akan memperkenalkan cara menggunakan Golang untuk melaksanakan algoritma TOTP.

Pengenalan algoritma TOTP

Algoritma TOTP (Kata Laluan Satu Masa Berasaskan Masa) sebenarnya ialah versi algoritma HOTP yang diperbaik. Ia berasal daripada spesifikasi RFC 6238 dan merupakan teknologi kata laluan sekali sahaja berdasarkan penyegerakan masa. Prinsip asas algoritma TOTP adalah untuk menjana kod respons OTP sekali berdasarkan kunci pratetap, masa semasa dan parameter lain.

Proses asas bagi keseluruhan algoritma ialah: klien menjana OTP baharu sekali-sekala, dan pelayan juga boleh menjana OTP yang sama melalui algoritma yang sama. Jika OTP yang dikira oleh pelanggan dan pelayan adalah konsisten, pengesahan lulus, jika tidak pengesahan gagal.

Keselamatan algoritma TOTP bergantung pada rawak kekunci pratetap dan masa semasa. Oleh itu, apabila kunci dan masa adalah rawak, algoritma TOTP boleh memberikan keselamatan yang tinggi.

Golang melaksanakan algoritma TOTP

Untuk melaksanakan algoritma TOTP di Golang, anda perlu menggunakan fungsi HMAC dalam pakej crypto dan fungsi cincang dalam pakej sha1. Golang menyediakan banyak fungsi cincang yang biasa digunakan, seperti SHA1, SHA256, dll., jadi anda boleh memilih fungsi cincang yang sepadan mengikut keperluan sebenar. Artikel ini menggunakan algoritma SHA1 sebagai contoh untuk menunjukkan cara melaksanakan algoritma 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
}

Dalam kod di atas, parameter rahsia ialah kunci lalai dan perlu menjadi rentetan berkod base32 standard. Dalam fungsi TOTPToken, kunci pertama dinyahkodkan menjadi kunci tatasusunan bait, kemudian hmac.Fungsi baharu digunakan untuk menjana objek hmac, masa UTC semasa dihantar kepada kaedah Tulis dalam format rentetan dan nilai cincangan dikira . Selepas itu, serpihan 4-bait dipintas daripada nilai cincang dan digunakan untuk menjana kod tindak balas OTP (truncatedHash). Akhir sekali, truncatedHash dinyahkodkan menjadi integer tidak bertanda 32-bit dan ditukar kepada rentetan 6-bit (token) sebagai hasil tindak balas algoritma TOTP.

Menguji algoritma TOTP

Sebelum menggunakan algoritma TOTP, pengguna perlu diberikan kunci, yang sama dengan kunci pada pelayan. Anda boleh menggunakan pustaka pihak ketiga (seperti Google Authenticator) untuk menjana kunci dan mencetaknya sebagai kod QR supaya pengguna boleh mengimbas kod QR untuk mendapatkan kunci apabila menggunakannya.

Berikut ialah contoh mudah, termasuk kod sisi klien dan pelayan.

Kod pelanggan:

package main

import (
    "fmt"
)

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

Kod pelayan:

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)
}

Dalam kod di atas, kami membina API mudah menggunakan pakej "http" Pelayan web boleh dapatkan kod respons TOTP semasa dengan meminta http://localhost:8080/totp. Selain itu, kami menyediakan program pelanggan supaya anda boleh menguji sama ada algoritma itu betul semasa menyahpepijat.

Ringkasan

TOTP ialah teknologi kata laluan sekali sahaja yang meningkatkan keselamatan pengesahan. Artikel ini memberi tumpuan kepada cara melaksanakan algoritma TOTP menggunakan Golang dan menyediakan contoh ujian. Dengan menguasai algoritma ini, kami boleh meningkatkan keselamatan aplikasi kami dan mengelakkan risiko pemintasan kata laluan.

Atas ialah kandungan terperinci Bagaimana untuk melaksanakan algoritma TOTP menggunakan Golang. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn