Delphi TOTP 二要素認証

Google Authenticator、Microsoft Authenticator、Authy が生成する6桁のコードで、どんなログインにも第二の認証要素を追加できます。シークレットを作成してQRコードとして表示し、サーバー側でコードを検証します。

TsgcTOTPAuthenticator

時間ベース(RFC 6238)およびカウンターベース(RFC 4226)のワンタイムパスワードを実装する非表示コンポーネントです。接続を一切開かないため、ログインフォーム、REST API、WebSocket サーバーのいずれでも同じように使用できます。

コンポーネントクラス

TsgcTOTPAuthenticator(ユニット sgcAuth_TOTP

プロトコル

TOTP (RFC 6238) および HOTP (RFC 4226)

対応プラットフォーム

Windows, macOS, Linux, iOS, Android

エディション

Enterprise および All-Access、加えて sgcAuth パックでも利用できます。sgcWebSockets .NET でも利用可能です。

ユーザーを登録してコードを検証する

ユーザーごとに一度 GenerateSecret を呼び出し、GetProvisioningURI を QR コードとして表示してシークレットを保存し、ログイン時に入力されたコードを VerifyCode で確認します。

uses
  sgcAuth_TOTP;

var
  TOTP: TsgcTOTPAuthenticator;
  vSecret, vURI: string;
begin
  TOTP := TsgcTOTPAuthenticator.Create(nil);
  TOTP.Issuer := 'Example App';

  // 登録:新しい Base32 シークレットと QR コード用の otpauth:// URI
  vSecret := TOTP.GenerateSecret;
  vURI := TOTP.GetProvisioningURI('alice@example.com', vSecret);
  // vSecret をユーザーレコードとともに保存し、vURI を QR コードとして描画します

  // ログイン時:ユーザーが入力したコードを確認します
  if TOTP.VerifyCode(vSecret, edtCode.Text) then
    ShowMessage('Code accepted');

  // 端末を紛失した場合に備えたワンタイムリカバリーコード
  TOTP.GenerateRecoveryCodes(memoRecovery.Lines, 10);
end;
// uses: sgcAuth_TOTP
TsgcTOTPAuthenticator *TOTP = new TsgcTOTPAuthenticator(this);
TOTP->Issuer = "Example App";

String Secret = TOTP->GenerateSecret();
String URI = TOTP->GetProvisioningURI("alice@example.com", Secret);

if (TOTP->VerifyCode(Secret, edtCode->Text))
  ShowMessage("Code accepted");

TOTP->GenerateRecoveryCodes(memoRecovery->Lines, 10);

主な機能

最初のQRコード発行から端末紛失時の復旧まで、第二要素に必要なすべてを備えています。シークレットの保存方法はご自由に設計いただけます。

シークレットとQRプロビジョニング

GenerateSecretSecretLength バイト(既定は20)のランダムな Base32 シークレットを返します。GetProvisioningURIIssuerAlgorithmDigitsPeriod を含む otpauth://totp/ URI を生成し、そのままQRコードとして描画できます。

クロックドリフトの許容

VerifyCode は現在のタイムステップに加えて前後 Window ステップ(既定は1)を受け入れるため、端末の時計が数秒ずれていてもログインできます。

リプレイ対策

aLastTimeStep を伴う VerifyCode のオーバーロードは、前回使用したステップより後のタイムステップのみを受け入れ、一致したステップを返すため、同じコードが二度使われることはありません。

HOTP カウンター

GenerateHOTPVerifyHOTP はハードウェアトークン向けのカウンターベース方式を実装しており、検証成功時にカウンターを再同期する先読みウィンドウを備えています。

リカバリーコード

GenerateRecoveryCodes は任意の TStrings に一意なワンタイムコードを書き込みます。認証アプリの入った端末を紛失したユーザーのための予備手段です。

アルゴリズムと桁数

Algorithm で HMAC-SHA1(すべてのアプリが対応する既定値)、HMAC-SHA256、HMAC-SHA512 を選択でき、コードは6〜8 Digits、任意の Period に対応します。

仕様・参考資料

このコンポーネントが実装する標準規格の公式ソースです。

ドキュメント・デモ

コンポーネントリファレンスへの直接リンク、すぐに実行できるデモプロジェクトの入手、体験版のダウンロードができます。

オンラインヘルプ — TsgcTOTPAuthenticator このコンポーネントのプロパティ、メソッド、イベントの完全なリファレンスです。
デモプロジェクト — Demos\26.Authentication\02.TOTP QRコードによる登録、リアルタイムのコード生成、リプレイ対策付き検証、リカバリーコードを収録しています。sgcWebSockets パッケージに同梱されています。以下から体験版をダウンロードできます。
技術ドキュメント (PDF) このコンポーネントの機能、クイックスタート、Delphi および C++ Builder 向けのコードサンプル、一次資料のリファレンスを掲載しています。
ユーザーマニュアル (PDF) ライブラリのすべてのコンポーネントを網羅した総合マニュアルです。
ブログ — Delphi でパスキー、SAML SSO、LDAP、TOTP 2FA によるログインを実現する 6つの認証コンポーネントが1つの Delphi アプリケーションでどう連携するかを解説します。
最もお得な選択: All-AccesseSeGeCe の全製品にプレミアムサポートが付いて、年間 €1,059 からご利用いただけます。
All-Access の価格を見る

二要素認証を追加しませんか?

体験版をダウンロードして、認証アプリのコードで Delphi のログインを保護してください。