/2fa-totp-demo

2FA TOTP Demo.

Primary LanguageJavaMIT LicenseMIT

2fa-totp-demo

Java JUnit Gradle Spring Boot Spring Cloud Spring Cloud Alibaba Release

2FA TOTP Demo.

TOTP Server

Generate secret

public class TotpServerTests {
    @Test
    public void testGenSecret() {
        // secret
        SecretGenerator secretGenerator = new DefaultSecretGenerator();
        String secret = secretGenerator.generate();
        log.info("testGenSecret -> secret={}", secret);
    }
}

Generate qr image

public class TotpServerTests {
    @Test
    public void testGenQrImage() throws Exception {
        // secret
        String secret = "QYUBLST6D6QHB4GXK5W754WJEZHS5KUM";

        // qr code
        QrData qrData = new QrData.Builder()
                .label("aaric")
                .issuer("InCar")
                .secret(secret)
                .algorithm(HashingAlgorithm.SHA1)
                .digits(6)
                .period(30)
                .build();

        // qr image
        QrGenerator qrGenerator = new ZxingPngQrGenerator();
        byte[] qrBytes = qrGenerator.generate(qrData);
        String qrMimeType = qrGenerator.getImageMimeType();
        String qrImageUri = Utils.getDataUriForImage(qrBytes, qrMimeType);
        log.info("testGenQrImage -> qrImageUri={}", qrImageUri);
    }
}

Valid code

public class TotpServerTests {
    @Test
    public void testValidCode() {
        // secret
        String secret = "QYUBLST6D6QHB4GXK5W754WJEZHS5KUM";

        // valid
        TimeProvider timeProvider = new SystemTimeProvider();
        //CodeGenerator codeGenerator = new DefaultCodeGenerator();
        CodeGenerator codeGenerator = new DefaultCodeGenerator(HashingAlgorithm.SHA1, 6);
        CodeVerifier codeVerifier = new DefaultCodeVerifier(codeGenerator, timeProvider);
        log.info("testValidCode -> isValidCode={}", codeVerifier.isValidCode(secret, "340200"));
    }
}

Generate recovery codes

public class TotpServerTests {
    @Test
    public void testGenRecoveryCodes() {
        // recovery
        RecoveryCodeGenerator recoveryCodeGenerator = new RecoveryCodeGenerator();
        String[] recoveryCodes = recoveryCodeGenerator.generateCodes(12);
        for (String code : recoveryCodes) {
            log.info("{}", code);
        }
    }
}

TOTP Client

Generate code

public class TotpServerTests {
    @Test
    public void testGenCode() throws Exception {
        // secret
        String secret = "QYUBLST6D6QHB4GXK5W754WJEZHS5KUM";

        // valid
        int timePeriod = 30;
        //TimeProvider timeProvider = new SystemTimeProvider();
        TimeProvider timeProvider = new NtpTimeProvider("ntp6.aliyun.com", 3000);
        long counter = Math.floorDiv(timeProvider.getTime(), timePeriod);
        log.info("counter: {}", counter);
        CodeGenerator codeGenerator = new DefaultCodeGenerator();
        log.info("code: {}", codeGenerator.generate(secret, counter));
    }
}

Web Browser

  http://localhost:8080/home/index