Javaは、OTP動的パスワードの2要素認証を実装しています

序文

2要素認証(英語:2要素認証、2FAと略記)、2要素認証、2要素認証、2要素認証、2段階認証とも呼ばれる(2段階認証、翻訳済み) 2段階認証として)は、一種の認証方法です。

原理
動的パスワードの生成方法は、主にサーバーとパスワードジェネレータ間の同期条件として時差を使用します。ログインが必要な場合は、パスワードジェネレータを使用して動的パスワードを生成します。OTPは通常、時間使用と時間使用の2つのタイプに分けられます。時間使用OTPが生成された後は、無制限に使用できます。時間;時間使用OTPパスワードの有効時間を30秒から2分の範囲で設定できます。OTPは認証後に破棄され、次の認証に新しいパスワードを使用する必要があるため、難易度が高くなります。制限されたリソースに許可なくアクセスしようとすること。

TOTP技術標準
https://datatracker.ietf.org/doc/html/rfc6238

関連技術文書

ログイン認証にOTP動的パスワード(毎分変更)を使用する

GoogleAPIを使用してQRコードをすばやく生成する


OTPスキャンの文字列形式

フォーマット:

otpauth://totp/账号?secret=秘钥

例:

otpauth://totp/花伤情犹在?secret=RR7VFLUFFJPJ4FYFS66REZG6FROEI55M

アカウントとキーを入力して、トークンを手動で追加できます

OTP動的パスワードを実現するための使用阿里云身份宝または時刻同期Google Authenticator

ここに画像の説明を挿入

または、OTP文字列からQRコードを生成します

飼料QRコードジェネレーター:https ://cli.im/

ここに画像の説明を挿入

トークンは、アカウントと秘密鍵を手動で入力するか、QRコードをスキャンすることで追加できます

ここに画像の説明を挿入

GoogleAPIでQRコードを生成する

このプロジェクトはGoogle API、生成されたQRコードを使用することです

リンクパラメータの詳細:

  1. https://chart.googleapis.com/chart?これはGoogleChartAPIのヘッドです、直接コピーしてください〜
  2. &cht=qrこれは、チャートタイプが2次元コードであるqrであることを意味します。
  3. &chs=200×200これは、生成された画像のサイズが幅×高さである200×200であることを意味します。これは、生成された画像の実際のサイズではなく、最大サイズである必要があります。
  4. &choe=UTF-8これは、コンテンツのエンコード形式がUTF-8であり、この値のデフォルトがUTF-8であることを意味します。他のエンコード形式については、GoogleAPIのドキュメントを参照してください。
  5. &chld=L|4 Lデフォルトのエラー訂正レベルを表します。4はQRコードのマージンサイズを表し、自分で調整できます。特定のパラメータについては、GoogleAPIのドキュメントを参照してください。
  6. &chl=XXXXこれはQRコンテンツであり、デコード後に表示される情報です。中国語を含める場合は、UTF-8エンコードの漢字を使用してください。使用しないと問題が発生します。

j256オープンソースの2段階認証

2段階認証

<dependency>
    <groupId>com.j256.two-factor-auth</groupId>
    <artifactId>two-factor-auth</artifactId>
    <version>1.3</version>
</dependency>

Githubアドレス

2段階認証Javaコード

時間ベースのワンタイムパスワード(TOTP)アルゴリズムを使用する2段階認証(2FA)Javaコード。このコードは、Google認証システムモバイルアプリまたはAuthyモバイルアプリまたはブラウザアプリで使用できます。

キーを生成する

  1. ユーザーのbase-32形式でシークレットを生成するためにgenerateBase32Secret()に使用されます。例:「NY4A5CPJZ46LXZCP」
  2. ユーザーアカウントに関連付けられているデータベースにキーを保存します。
  3. qrImageUrl(…)からユーザーに返されたQRコード画像のURLを表示します。

ユーザーは、画像を使用してキーを認証システムアプリに読み込みます。

確認キー

  1. ユーザーは、オーセンティケーターアプリケーションからの番号をWebサーバーのログインフォームに入力します。
  2. Webサーバーは、データベースからユーザーアカウントに関連付けられたキーを読み取ります。
  3. サーバーは、ユーザー入力をgenerateCurrentNumberString(…)からの出力と比較します。
  4. それらが等しい場合、ユーザーはログインできます。

コード例

public static void main(String[] args) throws Exception {
    
    

        // 生成Base32秘钥
        String base32Secret = TimeBasedOneTimePasswordUtil.generateBase32Secret(32);

        System.out.println("secret = " + base32Secret);

        // 这是可以由验证程序显示的密钥的名称
        String keyId = "hsqyz";
        // 生成二维码
        System.out.println("Image url = " + TimeBasedOneTimePasswordUtil.qrImageUrl(keyId, base32Secret));
        //我们可以将此图像显示给用户,让他们将其加载到他们的身份验证程序中

        // 我们可以在这里使用代码并将其与用户输入进行比较
        String code = TimeBasedOneTimePasswordUtil.generateCurrentNumberString(base32Secret);

        System.out.println("code : "+code);

        /*
         * 此循环显示数字如何随时间变化
         */
        while (true) {
    
    
            long diff = TimeBasedOneTimePasswordUtil.DEFAULT_TIME_STEP_SECONDS
                    - ((System.currentTimeMillis() / 1000) % TimeBasedOneTimePasswordUtil.DEFAULT_TIME_STEP_SECONDS);
            code = TimeBasedOneTimePasswordUtil.generateCurrentNumberString(base32Secret);
            System.out.println("Secret code = " + code + ", change in " + diff + " seconds");
            Thread.sleep(1000);
        }


    }

suyin58オープンソースの2段階認証

データベーステーブルの構造:

CREATE TABLE `t_user` (
  `username` varchar(30) COLLATE utf8_bin NOT NULL,
  `otp_sk` varchar(64) COLLATE utf8_bin NOT NULL,
  PRIMARY KEY (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

ユーザーを作成

  • RegistTestのメインメソッドを実行し、f_temp [一時的なQRコード画像の保存ディレクトリ]を変更することに注意してください。email[QRコード画像の電子メールアドレスを受信する]
    プロジェクトはtomcat、ログインアドレスの下に展開されます
  • http://127.0.0.1:8580/login.jsp

おすすめ

転載: blog.csdn.net/qq_31762741/article/details/122889805