序文
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スキャンの文字列形式
フォーマット:
otpauth://totp/账号?secret=秘钥
例:
otpauth://totp/花伤情犹在?secret=RR7VFLUFFJPJ4FYFS66REZG6FROEI55M
アカウントとキーを入力して、トークンを手動で追加できます
OTP動的パスワードを実現するための使用阿里云身份宝
または時刻同期Google Authenticator
または、OTP文字列からQRコードを生成します
飼料QRコードジェネレーター:https ://cli.im/
トークンは、アカウントと秘密鍵を手動で入力するか、QRコードをスキャンすることで追加できます
GoogleAPIでQRコードを生成する
このプロジェクトはGoogle API
、生成されたQRコードを使用することです
リンクパラメータの詳細:
https://chart.googleapis.com/chart?
これはGoogleChartAPIのヘッドです、直接コピーしてください〜&cht=qr
これは、チャートタイプが2次元コードであるqrであることを意味します。&chs=200×200
これは、生成された画像のサイズが幅×高さである200×200であることを意味します。これは、生成された画像の実際のサイズではなく、最大サイズである必要があります。&choe=UTF-8
これは、コンテンツのエンコード形式がUTF-8であり、この値のデフォルトがUTF-8であることを意味します。他のエンコード形式については、GoogleAPIのドキュメントを参照してください。&chld=L|4 L
デフォルトのエラー訂正レベルを表します。4はQRコードのマージンサイズを表し、自分で調整できます。特定のパラメータについては、GoogleAPIのドキュメントを参照してください。&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>
2段階認証Javaコード
時間ベースのワンタイムパスワード(TOTP)アルゴリズムを使用する2段階認証(2FA)Javaコード。このコードは、Google認証システムモバイルアプリまたはAuthyモバイルアプリまたはブラウザアプリで使用できます。
- TOTPのウィキペディアページを参照してください
- gitリポジトリから入手可能なコード
- Mavenパッケージはによって公開されています
キーを生成する
- ユーザーのbase-32形式でシークレットを生成するためにgenerateBase32Secret()に使用されます。例:「NY4A5CPJZ46LXZCP」
- ユーザーアカウントに関連付けられているデータベースにキーを保存します。
- qrImageUrl(…)からユーザーに返されたQRコード画像のURLを表示します。
ユーザーは、画像を使用してキーを認証システムアプリに読み込みます。
確認キー
- ユーザーは、オーセンティケーターアプリケーションからの番号をWebサーバーのログインフォームに入力します。
- Webサーバーは、データベースからユーザーアカウントに関連付けられたキーを読み取ります。
- サーバーは、ユーザー入力をgenerateCurrentNumberString(…)からの出力と比較します。
- それらが等しい場合、ユーザーはログインできます。
コード例
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