>  기사  >  백엔드 개발  >  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 알고리즘의 기본 원리는 미리 설정된 키, 현재 시간 및 기타 매개변수를 기반으로 일회성 OTP 응답 코드를 생성하는 것입니다.

전체 알고리즘의 기본 프로세스는 클라이언트가 가끔씩 새로운 OTP를 생성하고, 서버도 동일한 알고리즘을 통해 동일한 OTP를 생성할 수 있다는 것입니다. 클라이언트와 서버가 계산한 OTP가 일치하면 검증에 성공하고, 그렇지 않으면 검증에 실패합니다.

TOTP 알고리즘의 보안은 미리 설정된 키의 무작위성과 현재 시간에 따라 달라집니다. 따라서 키와 시간이 무작위인 경우 TOTP 알고리즘은 높은 보안성을 제공할 수 있습니다.

Golang은 TOTP 알고리즘을 구현합니다

Golang에서 TOTP 알고리즘을 구현하려면 crypto 패키지의 HMAC 함수와 sha1 패키지의 hash 함수를 사용해야 합니다. 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
}

위 코드에서 secret 매개변수는 기본 키이며 표준 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를 사용하여 http://localhost:8080/totp를 요청하여 간단한 웹 서버를 구축했습니다. 즉, 현재 TOTP 응답 코드를 얻을 수 있습니다. 또한, 디버깅을 하면서 알고리즘이 올바른지 테스트할 수 있도록 클라이언트 프로그램을 제공합니다.

요약

TOTP는 인증 보안을 강화한 일회용 비밀번호 기술입니다. 이 글에서는 Golang을 사용하여 TOTP 알고리즘을 구현하는 방법에 중점을 두고 테스트 예제를 제공합니다. 이 알고리즘을 마스터함으로써 애플리케이션의 보안을 강화하고 비밀번호 가로채기의 위험을 피할 수 있습니다.

위 내용은 Golang을 사용하여 TOTP 알고리즘을 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.