我正在写一个非常简单的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
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');
}
}
}
}
}发布于 2021-03-19 01:24:10
订阅Timer.periodic不是一个问题吗?
你的区块之外的东西应该是:
整除
3.1。如果是,则复位(GetNewCodeEvent);复位(计数器);
嗯..。我认为你的柜台应该由你的集团来处理。这将是更好的解决方案。
就像本例中的第一个解决方案Show running clock on flutter
https://stackoverflow.com/questions/66673221
复制相似问题