GOTP - The Golang One-Time Password Library
GOTP is a Golang package for generating and verifying one-time passwords. It can be used to implement two-factor (2FA) or multi-factor (MFA) authentication methods in anywhere that requires users to log in.
Open MFA standards are defined in RFC 4226 (HOTP: An HMAC-Based One-Time Password Algorithm) and in RFC 6238 (TOTP: Time-Based One-Time Password Algorithm). GOTP implements server-side support for both of these standards.
GOTP was inspired by PyOTP.
Installation
$ go get github.com/xlzd/gotp
Usage
Check API docs at https://godoc.org/github.com/xlzd/gotp
Time-based OTPs
totp := gotp.NewDefaultTOTP("4S62BZNFXXSZLCRO")
totp.Now() // current otp '123456'
totp.At(1524486261) // otp of timestamp 1524486261 '123456'
# OTP verified for a given timestamp
totp.Verify('492039', 1524486261) // true
totp.Verify('492039', 1520000000) // false
// generate a provisioning uri
totp.ProvisioningUri("demoAccountName", "issuerName")
// otpauth://totp/issuerName:demoAccountName?secret=4S62BZNFXXSZLCRO&issuer=issuerNameCounter-based OTPs
hotp := gotp.NewDefaultHOTP("4S62BZNFXXSZLCRO")
hotp.At(0) // '944181'
hotp.At(1) // '770975'
# OTP verified for a given timestamp
hotp.Verify('944181', 0) // true
hotp.Verify('944181', 1) // false
// generate a provisioning uri
hotp.ProvisioningUri("demoAccountName", "issuerName", 1)
// otpauth://hotp/issuerName:demoAccountName?secret=4S62BZNFXXSZLCRO&counter=1&issuer=issuerNameGenerate random secret
secretLength := 16
gotp.RandomSecret(secretLength) // LMT4URYNZKEWZRAAGoogle Authenticator Compatible
GOTP works with the Google Authenticator iPhone and Android app, as well as other OTP apps like Authy.
GOTP includes the ability to generate provisioning URIs for use with the QR Code
scanner built into these MFA client apps via otpObj.ProvisioningUri method:
gotp.NewDefaultTOTP("4S62BZNFXXSZLCRO").ProvisioningUri("demoAccountName", "issuerName")
// otpauth://totp/issuerName:demoAccountName?secret=4S62BZNFXXSZLCRO&issuer=issuerName
gotp.NewDefaultHOTP("4S62BZNFXXSZLCRO").ProvisioningUri("demoAccountName", "issuerName", 1)
// otpauth://hotp/issuerName:demoAccountName?secret=4S62BZNFXXSZLCRO&counter=1&issuer=issuerNameThis URL can then be rendered as a QR Code which can then be scanned and added to the users list of OTP credentials.
Working example
Scan the following barcode with your phone's OTP app (e.g. Google Authenticator):
Now run the following and compare the output:
package main
import (
"fmt"
"github.com/xlzd/gotp"
)
func main() {
fmt.Println("Current OTP is", gotp.NewDefaultTOTP("4S62BZNFXXSZLCRO").Now())
}License
GOTP is licensed under the MIT License

Formed in 2009, the Archive Team (not to be confused with the archive.org Archive-It Team) is a rogue archivist collective dedicated to saving copies of rapidly dying or deleted websites for the sake of history and digital heritage. The group is 100% composed of volunteers and interested parties, and has expanded into a large amount of related projects for saving online and digital history.

