首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Flutter:如何同步TOTP代码?

Flutter:如何同步TOTP代码?
EN

Stack Overflow用户
提问于 2021-03-17 20:35:23
回答 1查看 328关注 0票数 1

我正在写一个非常简单的2FA应用程序,它为给定的密钥、数字、间隔和算法生成TOTP代码。

然而,我在数学方面遇到了困难,我不知道如何构造生成TOTP代码的算法

我正在使用Flutter BLoC库以BLoC模式编写整个应用程序。

看看这个视频,应用程序生成了一个间隔为30秒的代码,但是进度指示器不是从0秒开始,而是每30秒从一个时间开始,例如: 13:00:00,当30秒过去(13:00:30)时,它会生成另一个代码。

视频:https://streamable.com/u7vhcg

现在,当涉及到我的应用程序时,它会生成代码,但它们不是同步的。我怎么做呢,它生成代码,但每个代码都是同步的?

我的应用程序视频:https://streamable.com/zn3pnf

如您所见,TOTP代码未同步。我如何做到这一点,以便它们将被同步?

如果你想看到更多的代码,请告诉我。

代码

totp_generator_bloc.dart

代码语言:javascript
复制
import 'dart:async';

import 'package:bloc/bloc.dart';
import 'package:dart_otp/dart_otp.dart';
import 'package:duckie/models/code/code_model.dart';
import 'package:hive/hive.dart';
import 'package:meta/meta.dart';

part 'totp_generator_event.dart';
part 'totp_generator_state.dart';

class TotpGeneratorBloc extends Bloc<TotpGeneratorEvent, TotpGeneratorState> {
  TotpGeneratorBloc() : super(TotpGeneratorInitial());

  @override
  Stream<TotpGeneratorState> mapEventToState(
    TotpGeneratorEvent event,
  ) async* {
    if (event is GetTotpItemsEvent) {
      Box box = Hive.box('totpmodel');
      List totpItems = [];

      for (var totpItem in box.values) {
        final String secret = totpItem.secret;
        final int digits = int.parse(totpItem.digits);
        final int interval = int.parse(totpItem.interval);
        final String algorithmString = totpItem.algorithm;
        final String accountName = totpItem.accountName;
        int timeStamp = totpItem.timeStamp;

        OTPAlgorithm algorithm = OTPAlgorithm.SHA1;

        switch (algorithmString) {
          case 'sha1':
            algorithm = OTPAlgorithm.SHA1;
            break;
          case 'sha256':
            algorithm = OTPAlgorithm.SHA256;
            break;
          case 'sha384':
            algorithm = OTPAlgorithm.SHA384;
            break;
          case 'sha512':
            algorithm = OTPAlgorithm.SHA512;
            break;
        }

        final TOTP totp = TOTP(
          secret: secret,
          digits: digits,
          interval: interval,
          algorithm: algorithm,
        );

        try {
          final String otp =
              totp.value(date: DateTime.fromMillisecondsSinceEpoch(timeStamp));

          totpItems.add(CodeModel(otp, interval, 0, accountName));

          yield TotpGeneratorFinal(totpItems);
        } catch (error) {
          yield TotpGeneratorError('totp-fail-title', 'totp-fail-content');
        }
      }
    }
  }
}
EN

回答 1

Stack Overflow用户

发布于 2021-03-19 01:24:10

订阅Timer.periodic不是一个问题吗?

你的区块之外的东西应该是:

  1. 从系统时钟(datetime)读取当前秒数(您将获得计数器的起始位置)

  1. subscribe to Timer.periodic(Duration(Duration(seconds: 1),(Timer t) => subscribe

  1. _handleClocksTick() -检查递增计数器是否能被30?

整除

3.1。如果是,则复位(GetNewCodeEvent);复位(计数器);

嗯..。我认为你的柜台应该由你的集团来处理。这将是更好的解决方案。

就像本例中的第一个解决方案Show running clock on flutter

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66673221

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档