最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java使用OTP動態(tài)口令(每分鐘變一次)進行登錄認證

 更新時間:2019年09月25日 15:08:31   作者:月·漩渦  
這篇文章主要介紹了Java使用OTP動態(tài)口令(每分鐘變一次)進行登錄認證,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

GIT地址:https://github.com/suyin58/otp-demo

動態(tài)碼截圖:

在對外網開放的后臺管理系統(tǒng)中,使用靜態(tài)口令進行身份驗證可能會存在如下問題:

(1) 為了便于記憶,用戶多選擇有特征作為密碼,所有靜態(tài)口令相比動態(tài)口令而言,容易被猜測和破解;

(2) 黑客可以從網上或電話線上截獲靜態(tài)密碼,如果是非加密方式傳輸,用戶認證信息可被輕易獲??;

(3) 內部工作人員可通過合法授權取得用戶密碼而非法使用;

靜態(tài)口令根本上不能確定用戶的身份,其結果是,個人可以輕松地偽造一個假身份或者盜用一個已有使用者的身份,給企業(yè)造成巨大的經濟和聲譽損失。本文主要介紹并實現了一種動態(tài)口令(OTP)的實現方式。

動態(tài)口令(OTP,One-Time Password)又稱一次性密碼,是使用密碼技術實現的在客戶端和服務器之間通過共享秘密的一種認證技術,是一種強認證技術,是增強目前靜態(tài)口令認證的一種非常方便技術手段,是一種重要的雙因素認證技術,動態(tài)口令認證技術包括客戶端用于生成口令產生器的,動態(tài)令牌,是一個硬件設備,和用于管理令牌及口令認證的后臺動態(tài)口令認證系統(tǒng)組成。

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

(1)時間同步

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

(2)事件同步

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

(3)挑戰(zhàn)/應答

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

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

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

由于客戶端需要存儲密鑰和計算校驗碼的載體,阿里云的身份寶(或者Google 的Authenticator)提供了手機端的APP進行密鑰存儲和校驗碼計算。下面我們以這兩款客戶端為例,實現在應用采用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中生成的字符串生成二維碼,通過郵件發(fā)送給用戶

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>"
     +"系統(tǒng)使用密碼 + 動態(tài)口令雙因素認證的方式登錄。</br>請按以下方式激活手機動態(tài)口令:</br>安卓用戶請點擊<a 
     +"</br>蘋果手機在AppStore中搜索【身份寶】(Alibaba)。下載安裝后,通過掃描以下二維碼激活動態(tài)口令。</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位校驗碼(每分鐘變化)。

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("生成動態(tài)口令出錯:" + secretBase32, e);
   throw new RuntimeException("生成動態(tài)口令出錯");
  }

1.3 比較客戶端和客戶端校驗碼是否一致

代碼參考略

其他,Demo中的例子可以使用身份 + 密碼,先進行密碼驗證,在通過動態(tài)口令進行二次驗證,使系統(tǒng)登錄更加安全可靠。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

您可能感興趣的文章:

相關文章

  • Java注解機制之Spring自動裝配實現原理詳解

    Java注解機制之Spring自動裝配實現原理詳解

    這篇文章主要為大家詳細介紹了Java注解機制之Spring自動裝配實現原理,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • Java實現畫圖的詳細步驟(完整代碼)

    Java實現畫圖的詳細步驟(完整代碼)

    今天給大家?guī)淼氖顷P于Java的相關知識,文章圍繞著Java實現畫圖的詳細步驟展開,文中有非常詳細的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • 解決在IDEA中創(chuàng)建多級package的問題

    解決在IDEA中創(chuàng)建多級package的問題

    這篇文章主要介紹了解決在IDEA中創(chuàng)建多級package的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • 從Spring源碼解析事務失效的原因

    從Spring源碼解析事務失效的原因

    今天帶大家學習Spring的相關知識,文章圍繞著Spring事務失效的原因等相關知識展開,文中有非常詳細的介紹及圖文示例,需要的朋友可以參考下
    2021-06-06
  • 關于Java中反射機制的深入講解

    關于Java中反射機制的深入講解

    反射(Reflection)是Java 程序開發(fā)語言的特征之一,它允許運行中的 Java 程序獲取自身的信息,并且可以操作類或對象的內部屬性,下面這篇文章主要給大家介紹了關于Java中反射機制的相關資料,需要的朋友可以參考下
    2018-08-08
  • SpringBoot屬性注入的多種方式實例

    SpringBoot屬性注入的多種方式實例

    在 SpringBoot中,提供了一種新的屬性注入方式,支持各種java基本數據類型及復雜類型的注入,下面這篇文章主要給大家介紹了關于SpringBoot屬性注入的多種方式,需要的朋友可以參考下
    2021-10-10
  • SpringMVC如何域對象共享數據

    SpringMVC如何域對象共享數據

    在Spring MVC中,可以使用域對象來共享數據,域對象是一個Map類型的對象,可以在請求處理方法之間共享數據,本文給大家介紹SpringMVC 域對象共享數據的示例代碼,一起看看吧
    2023-09-09
  • 完美解決request請求流只能讀取一次的問題

    完美解決request請求流只能讀取一次的問題

    這篇文章主要介紹了完美解決request請求流只能讀取一次的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • Java?Chassis3熔斷機制的改進路程技術解密

    Java?Chassis3熔斷機制的改進路程技術解密

    這篇文章主要介紹了Java?Chassis?3技術解密之熔斷機制的改進路程實例分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2024-01-01
  • spring boot中使用@Async實現異步調用任務

    spring boot中使用@Async實現異步調用任務

    本篇文章主要介紹了spring boot中使用@Async實現異步調用任務,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-02-02

最新評論

连云港市| 吉木萨尔县| 牟定县| 那坡县| 吴堡县| 沙河市| 格尔木市| 渭南市| 天津市| 长宁县| 奉新县| 衡水市| 洞头县| 沙田区| 陇川县| 蒙城县| 麦盖提县| 武穴市| 建湖县| 广汉市| 云和县| 拉萨市| 扎鲁特旗| 观塘区| 信阳市| 阜平县| 慈溪市| 兖州市| 民和| 慈溪市| 谷城县| 德安县| 兴和县| 花莲市| 周宁县| 上杭县| 鄂尔多斯市| 漳州市| 张家口市| 廉江市| 汤阴县|