Implementare l'autenticazione a due fattori (2FA) con Go

L'autenticazione a due fattori (2FA) è un metodo di sicurezza che richiede due forme di identificazione prima di concedere l'accesso a un sistema. In questo articolo vedremo come implementare un semplice sistema 2FA utilizzando codici TOTP (Time-based One-Time Password) in Go.

Prerequisiti

  • Un ambiente Go configurato
  • Una libreria TOTP, come github.com/pquerna/otp

1. Installare la libreria OTP

Per cominciare, dobbiamo installare la libreria che gestisce TOTP:

go get github.com/pquerna/otp

2. Generare un secret TOTP

Ogni utente dovrebbe avere un secret univoco che verrà usato per generare i codici temporanei. Ecco come generarlo:

package main

import (
    "fmt"
    "github.com/pquerna/otp/totp"
)

func main() {
    key, err := totp.Generate(totp.GenerateOpts{
        Issuer:      "EsempioApp",
        AccountName: "utente@example.com",
    })
    if err != nil {
        panic(err)
    }

    fmt.Println("Secret:", key.Secret())
    fmt.Println("URL OTPAuth:", key.URL())
}

Il campo key.URL() può essere trasformato in un QR code e scansionato con un'app come Google Authenticator o Authy.

3. Verificare i codici OTP

Una volta che l'utente ha configurato l'app 2FA, può iniziare a inserire i codici generati. Possiamo verificarli con:

package main

import (
    "fmt"
    "github.com/pquerna/otp/totp"
    "time"
)

func main() {
    secret := "ABCDEF1234567890" // sostituire con il secret dell'utente
    code := "123456"             // codice inserito dall'utente

    valid := totp.Validate(code, secret)
    if valid {
        fmt.Println("Codice valido")
    } else {
        fmt.Println("Codice non valido")
    }
}

La funzione totp.Validate si occupa di confrontare il codice inserito con quello generato sul momento, accettando una piccola finestra temporale per compensare eventuali differenze di orario.

4. Sicurezza e buone pratiche

  • Conservare i secret TOTP in modo sicuro, ad esempio in un database cifrato.
  • Utilizzare HTTPS per tutte le comunicazioni tra client e server.
  • Non loggare mai i secret o i codici OTP.

Conclusione

Implementare l'autenticazione a due fattori in Go è relativamente semplice grazie a librerie come pquerna/otp. Aggiungendo questa misura di sicurezza si protegge meglio l'accesso degli utenti, riducendo il rischio di compromissioni anche in caso di furto di password.

Torna su