文章目錄
- 前言
- 一、什么是動態令牌?
- 二、使用的Jar包
- 1. 生成二維碼Jar包
- 2. Apache Commons Codec
- 3. 專案工具類
- 4. 下載鏈接
- 三、IDEA匯入外部Jar包
- 四、代碼測驗
- 1. 生成OTPAUTH協議等資訊
- 2. 微信小程式掃描結果
- 3. 測驗口令是否正確
- 總結
前言
說到帳號安全,當下國內很多網路服務例如銀行、游戲、淘寶等 ,除了正確的帳號密碼之外,常常還需要額外給你發一條手機短信驗證碼,以此進一步確認你是帳號的真正主人,這就是兩步驗證的一種實作方式,本次的任務內容就是使用Java模擬二次驗證碼(動態令牌)是如何進行實作,在模擬的程序中我明白了二次驗證碼(也叫兩步驗證)的實作原理,在此進行記錄,
任務描述:生成唯一的64位密鑰并將密鑰保存下來便于之后的測驗,通過密鑰來實作每隔一段時間就變化一次的動態數字,創建賬戶資訊并且生成OTPAUTH協議字串鏈接的二維碼,使用微信小程式或支付寶小程式搜索:二次驗證碼,使用小程式掃描該二維碼,如果掃描成功,則會看到動態令牌出在了手機上并且會有圓圈顯示倒計時失效的進度提示,將出現的動態令牌在Java程式中與通過當前密鑰生成的二次驗證碼進行對比,驗證動態生成的二維碼是否正確,
提示:以下是本篇文章正文內容,下面案例可供參考
一、什么是動態令牌?
動態口令是根據專門的演算法生成一個不可預測的亂數字組合,一個密碼使用一次有效,被廣泛運用在網銀、網游、電信運營商、電子政務、企業等應用領域, 動態口令是一種安全便捷的帳號防盜技術,可以有效保護交易和登錄的認證安全,采用動態口令就無需定期修改密碼,安全省心,從而在最基本的密碼認證這一環節保證了系統的安全性,解決因口令欺詐而導致的重大損失,防止惡意入侵者或人為破壞,解決由口令泄密導致的入侵問題, 動態令牌即是用來生成動態口令終端,
和短信驗證碼一樣道理,本文的動態令牌也是兩步驗證中的一種,也是相當于給帳號多加了一次驗證,除了在輸入正確的賬號和密碼之外,用戶同樣還需要額外輸入一個每隔一段時間就會自動變化一次的6位數字(兩步驗證碼)才能完成登錄或其它功能,所以即使用戶的帳號和密碼不慎泄露了,別人在沒有這個數字驗證碼時也是無法登錄到被泄露資訊的用戶的賬號的,這可以大大提高破解的難度和帳號的安全性,
二、使用的Jar包
1. 生成二維碼Jar包
這里我將com.google.zxing的二維碼生成工具進行了封裝,只留下了一個方法介面make方法

2. Apache Commons Codec
這個jar包當中使用到的類有實作Base32和Base64編碼的兩個工具類
3. 專案工具類
使用到的工具類中主要用到的有湘王老師給的四個工具類:
- 十六進制編碼工具類
- Base32編碼工具類
- 生成OTPAUTH協議等各種引數的工具類

4. 下載鏈接
下載鏈接:https://pan.baidu.com/s/1P2NWKClHXAj7TRFzAlc5Bg
提取碼:xhzy
三、IDEA匯入外部Jar包



四、代碼測驗
1. 生成OTPAUTH協議等資訊
package com.shijimo.token;
import com.shijimo.token.util.OTPAuthUtil;
import qr.CreateQR;
public class Main {
public static void main(String[] args) {
// write your code here
System.out.println("Hello,World!");
// 生成64位密鑰
String secretKey = OTPAuthUtil.generateSecret(64);
System.out.println("生成動態密鑰:" + secretKey);
// 生成賬戶名
String account = "YkForever";
// 生成OTP協議的路徑
String totpURI = OTPAuthUtil.generateTotpURI(account, secretKey);
System.out.println("生成的協議路徑為:" + totpURI);
CreateQR.make(350,350,totpURI,"D:/qr.png");
}
}
在這里生成了64位密鑰、OTPAUTH的賬戶名字和協議路徑以及二維碼的存盤地址


2. 微信小程式掃描結果

將賬戶添加到小程式中后會有口令的顯示

3. 測驗口令是否正確
package com.shijimo.token;
import com.shijimo.token.util.OTPAuthUtil;
import java.util.Scanner;
/**
* @author Dream_飛翔
* @date 2021/10/29
* @time 22:16
* @email 1072876976@qq.com
*/
public class TestToken {
public static void main(String[] args) {
// 動態驗證生成的口令是否正確
String secret = "自動生成的64位密鑰";
// 小程式中顯示的動態令牌
String code = "716471";
boolean result = OTPAuthUtil.verify(secret, code);
System.out.println("動態口令是否正確:" + result);
}
}

動態令牌(二次驗證碼)測驗成功
總結
以上便是二次驗證碼的實作程序,相較于短信驗證碼來說,手機短信驗證碼和兩步驗證的目的和作用基本一致,不過很多的 (國外) 網路服務并不支持發送手機短信驗證碼,主要是短信成本高,而且有安全性風險 (比如 2G 網路下黑客可以利用 GSM 漏洞監聽截取到用戶的手機號碼和短信內容),而本文所說的二步驗證是指虛擬 MFA,或者說是“身份驗證器”,是基于時間和加密演算法生成“每 30 秒變化一次的 6 位數字驗證碼”,也叫做 TOTP (Time-Based One-time Password) 或 OTP 一次性密碼,它的優點是使用時無需聯網、僅需時間進行計算、速度快、可離線使用、沒有額外成本、演算法協議公開通用,開發和使用上都很簡單,可以用小型硬體 (物體的密碼器) 或純軟體 APP 來實作,因此更多的網站會支持這種方式,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/344227.html
標籤:java
上一篇:基于java疫情防控管理系統
