Generare OTP in Kotlin

Mattepuffo's logo
Generare OTP in Kotlin

Generare OTP in Kotlin

OTP sta per One Time Password, ed è sempre più usato per migliorare la sicurezza online; sia per il login che per effettuare altre operazioni.

In genere questi OTP vengono iviati per SMS o per email.

Oggi vediamo come crearli in Kotlin usando la libreria Kotlin One-Time Password Library!

Per installarla ho usato Maven aggiungendo questa dipendenza:

        <dependency>
            <groupId>dev.turingcomplete</groupId>
            <artifactId>kotlin-onetimepassword</artifactId>
            <version>2.1.0</version>
        </dependency>

Cominciamo con il codice per creare un OTP a tempo:

import dev.turingcomplete.kotlinonetimepassword.*
import java.util.concurrent.TimeUnit

fun main(args: Array<String>) {
    val secret = "mattepuffo_otp"

    totp(secret)
}

fun totp(secret: String) {
    val config = TimeBasedOneTimePasswordConfig(
        codeDigits = 6,
        hmacAlgorithm = HmacAlgorithm.SHA512,
        timeStep = 5,
        timeStepUnit = TimeUnit.SECONDS
    )
    val totpGenerator = TimeBasedOneTimePasswordGenerator(secret.toByteArray(), config)

    val totp = totpGenerator.generate(System.currentTimeMillis())

    println(totp)
    println(totpGenerator.isValid(totp, System.currentTimeMillis()))
    Thread.sleep(10000)
    println(totpGenerator.isValid(totp, System.currentTimeMillis()))
}

Lo creiamo di 6 cifre, e con una validità di 5 secondi.

Infatti il primo isValid darà true, il secondo false (dovete aspettare i 10 secondi di sleep).

Poi abbiamo la possibilità di crearli counter based:

import dev.turingcomplete.kotlinonetimepassword.*
import java.util.concurrent.TimeUnit

fun main(args: Array<String>) {
    val secret = "mattepuffo_otp"

    hotp(secret)
}

fun hotp(secret: String) {
    val config = HmacOneTimePasswordConfig(
        codeDigits = 6,
        hmacAlgorithm = HmacAlgorithm.SHA512
    )
    val hotpGenerator = HmacOneTimePasswordGenerator(secret.toByteArray(), config)

    val hotp = hotpGenerator.generate(5)

    println(hotp)
    println(hotpGenerator.isValid(hotp, 5))
    println(hotpGenerator.isValid(hotp, 6))
}

Ho fatto il test con due counter diversi per vedere il risultato.

Enjoy!


Condividi

Commentami!