溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么在Java中利用OTP動態口令實現登錄認證

發布時間:2021-03-23 16:37:11 來源:億速云 閱讀:987 作者:Leah 欄目:編程語言

這篇文章將為大家詳細講解有關怎么在Java中利用OTP動態口令實現登錄認證,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。

otp從技術來分有三種形式,時間同步、事件同步、挑戰/應答。

(1)時間同步

原理是基于動態令牌和動態口令驗證服務器的時間比對,基于時間同步的令牌,一般每60秒產生一個新口令,要求服務器能夠十分精確的保持正確的時鐘,同時對其令牌的晶振頻率有嚴格的要求,這種技術對應的終端是硬件令牌。

(2)事件同步

基于事件同步的令牌,其原理是通過某一特定的事件次序及相同的種子值作為輸入,通過HASH算法中運算出一致的密碼。

(3)挑戰/應答

常用于的網上業務,在網站/應答上輸入服務端下發的挑戰碼,動態令牌輸入該挑戰碼,通過內置的算法上生成一個6/8位的隨機數字,口令一次有效,這種技術目前應用最為普遍,包括刮刮卡、短信密碼、動態令牌也有挑戰/應答形式。

使用阿里云身份寶(或者Google Authenticator)時間同步實現OTP動態口令

怎么在Java中利用OTP動態口令實現登錄認證

如上圖,是一種基于時間同步的OTP計算方式,是通過客戶端和服務器持有相同的密鑰并基于時間基數,服務端和客戶端采用相同的Hash算法,計算出長度為六位的校驗碼。當客戶端和服務端計算出的校驗碼相同是,那么驗證通過。

由于客戶端需要存儲密鑰和計算校驗碼的載體,阿里云的身份寶(或者Google 的Authenticator)提供了手機端的APP進行密鑰存儲和校驗碼計算。下面我們以這兩款客戶端為例,實現在應用采用OTP進行權限驗證,主要流程如下圖:

怎么在Java中利用OTP動態口令實現登錄認證

流程關鍵代碼如下,(更詳細代碼,請Git下載:https://github.com/suyin58/otp-demo)

1 用戶注冊:

1.1 生成OTP密鑰:

String secretBase32 = TotpUtil.getRandomSecretBase32(64);
oper.setOtpSk(secretBase32);

1.2 生成OTP掃描用字符串:

約定字符串格式如下:

otpauth://totp/[客戶端顯示的賬戶信息]?secret=[secretBase32]

String totpProtocalString = TotpUtil.generateTotpString(operCode, host, secretBase32);

1.3 將1.2中生成的字符串生成二維碼,通過郵件發送給用戶

String host = "otptest@wjs.com"; // 自定義

   String totpProtocalString = TotpUtil.generateTotpString(operCode, host, secretBase32);

   String filePath = f_temp;
   String fileName = Long.toString(System.currentTimeMillis()) + ".png";
   
   try{
    QRUtil.generateMatrixPic(totpProtocalString, 150, 150, filePath, fileName);
   }catch (Exception e){
    throw new RuntimeException("生成二維碼圖片失敗:" + e.getMessage());
   }


   String content = "用戶名:"+operCode+"</br>"
     +"系統使用密碼 + 動態口令雙因素認證的方式登錄。</br>請按以下方式激活手機動態口令:</br>安卓用戶請點擊<a href='http://otp.aliyun.com/updates/shenfenbao.apk'>下載</a>,"
     +"</br>蘋果手機在AppStore中搜索【身份寶】(Alibaba)。下載安裝后,通過掃描以下二維碼激活動態口令。</br>"
     +"<img src=\"cid:image\">";
   EmailBaseLogic emailBaseLogic = new EmailBaseLogic();
//   String to, String title, String content, String imagePath
   emailBaseLogic.sendWithPic(email,"賬戶開立通知", content, filePath + "/" + fileName);

1.4 將用戶注冊信息與1.1的OTP密鑰存儲到數據庫中

數據存儲代碼(略)

2 客戶端工具使用

2.1 下載APP

安卓用戶下載地址:http://otp.aliyun.com/updates/shenfenbao.apk

蘋果手機在AppStore中搜索【身份寶】(Alibaba),或者Google Authenticator

2.2 掃描二維碼

使用下載的APP,掃描1.3郵件中的二維碼,客戶端獲取密鑰。APP使用密鑰基于時間算出6位校驗碼(每分鐘變化)。

怎么在Java中利用OTP動態口令實現登錄認證

1 用戶登錄

客戶端輸入登錄用戶名、用戶密碼,以及2.2客戶端工具中的6位校驗碼。

1.1 服務端根據用戶名和用戶密碼獲取用戶信息和密鑰

代碼參考略

1.2 服務端使用密鑰基于時間算出6位校驗碼

String secretHex = "";
  try {
   secretHex = HexEncoding.encode(Base32String.decode(secretBase32));
  } catch (Base32String.DecodingException e) {
   LOGGER.error("解碼" + secretBase32 + "出錯,", e);
   throw new RuntimeException("解碼Base32出錯");
  }

  long X = 30;

  String steps = "0";
  DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  df.setTimeZone(TimeZone.getTimeZone("UTC"));

  long currentTime = System.currentTimeMillis() / 1000L;
  try {
   long t = currentTime / X;
   steps = Long.toHexString(t).toUpperCase();
   while (steps.length() < 16) steps = "0" + steps;

   return generateTOTP(secretHex, steps, "6",
     "HmacSHA1");
  } catch (final Exception e) {
   LOGGER.error("生成動態口令出錯:" + secretBase32, e);
   throw new RuntimeException("生成動態口令出錯");
  }

關于怎么在Java中利用OTP動態口令實現登錄認證就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女