<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      一次性驗證碼的簡單使用

      前言

      一次性驗證碼(One-Time Password, OTP)是一種動態(tài)生成且僅能使用一次的密碼,主要用于增強賬戶安全性,防止密碼泄露或重放攻擊。

      使用

      添加依賴

      <dependency>
          <groupId>com.eatthepath</groupId>
          <artifactId>java-otp</artifactId>
          <version>0.2.0</version>
      </dependency>
      

      代碼實現(xiàn)

      package com.imooc;
      
      import com.eatthepath.otp.HmacOneTimePasswordGenerator;
      import com.eatthepath.otp.TimeBasedOneTimePasswordGenerator;
      
      import javax.crypto.spec.SecretKeySpec;
      import java.nio.charset.StandardCharsets;
      import java.security.NoSuchAlgorithmException;
      import java.time.Instant;
      import java.util.concurrent.TimeUnit;
      
      /**
       * 一次性驗證碼
       */
      public class TestOtp2 {
      
          private static TimeBasedOneTimePasswordGenerator totp;
      
          static {
              try {
                  totp = new TimeBasedOneTimePasswordGenerator();
              } catch (NoSuchAlgorithmException e) {
                  throw new RuntimeException(e);
              }
          }
      
          public static void main(String[] args) throws Exception {
              //同一個輸入在同一個時間窗口內(nèi)驗證碼是一樣的,如果想要不一樣,可以拼接上時間戳或計數(shù)器等變量
              String input = "123456";
              String otpCode = generateOtpCode(input, Instant.now());
              System.out.println("otpCode:" + otpCode);
              TimeUnit.SECONDS.sleep(31);
              System.out.println(verifyOtpCode(input, otpCode, 0));
          }
      
          /**
           * 生成驗證碼
           *
           * @param input     輸入數(shù)據(jù)
           * @param timestamp 時間戳
           * @return
           */
          private static String generateOtpCode(String input, Instant timestamp) throws Exception {
              byte[] bytes = input.getBytes(StandardCharsets.UTF_8);
              SecretKeySpec keySpec = new SecretKeySpec(bytes, TimeBasedOneTimePasswordGenerator.TOTP_ALGORITHM_HMAC_SHA1);
              int code = totp.generateOneTimePassword(keySpec, timestamp);
              // 位數(shù)不足左補0
              int len = HmacOneTimePasswordGenerator.DEFAULT_PASSWORD_LENGTH;
              return String.format("%0" + len + "d", code);
          }
      
          /**
           * 校驗驗證碼是否正確,比如容忍度是1,那就是校驗90秒內(nèi)這個驗證碼是否是有效的
           *
           * @param input     之前的輸入數(shù)據(jù)
           * @param otpCode   驗證碼
           * @param tolerance 容忍度
           * @return
           */
          private static boolean verifyOtpCode(String input, String otpCode, int tolerance) throws Exception {
              byte[] bytes = input.getBytes(StandardCharsets.UTF_8);
              SecretKeySpec keySpec = new SecretKeySpec(bytes, TimeBasedOneTimePasswordGenerator.TOTP_ALGORITHM_HMAC_SHA1);
              Instant now = Instant.now();
              // 當(dāng)前時間戳/30000
              long counter = now.toEpochMilli() / totp.getTimeStep().toMillis();
              // 30秒一個時間窗口
              for (long ts = counter - tolerance; ts <= counter + tolerance; ts++) {
                  int code = totp.generateOneTimePassword(keySpec, ts);
                  // 位數(shù)不足左補0
                  int len = HmacOneTimePasswordGenerator.DEFAULT_PASSWORD_LENGTH;
                  String newOtpCode = String.format("%0" + len + "d", code);
                  if (otpCode.equals(newOtpCode)) {
                      return true;
                  }
              }
              return false;
          }
      }
      
      
      posted @ 2025-04-06 11:20  strongmore  閱讀(105)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 无码国产精品一区二区免费虚拟vr| 国产小受被做到哭咬床单GV| 97久久精品亚洲中文字幕无码| 亚洲国产精品一区二区第一页| 精品国产一国产二国产三| 国产成AV人片久青草影院| 福利一区二区在线观看| 波多野结衣久久一区二区| 亚洲色大成成人网站久久| 久久久久久无码午夜精品直播| 国产成人精品亚洲日本片| 日韩加勒比一本无码精品| 韩国三级+mp4| 国产专区一va亚洲v天堂| 视频一区视频二区视频三区| 亚洲丰满熟女一区二区v| 国内极度色诱视频网站| 国产95在线 | 欧美| 久热这里只有精品6| 欧美成人午夜在线观看视频| 亚洲暴爽av天天爽日日碰| 亚洲欧美中文字幕5发布| 欧洲性开放老太大| 久久精品国产精品亚洲艾| 久久人人97超碰国产精品| 国产精品综合色区av| 老熟妇欲乱一区二区三区| 欧洲精品色在线观看| 无遮高潮国产免费观看| 亚洲综合在线一区二区三区| 国产二区三区不卡免费| 国产乱色国产精品免费视频| 精品尤物国产尤物在线看| 99久久精品美女高潮喷水| 国产一区二区三区无遮挡| 国产精品国产精品一区精品| 国产片AV国语在线观看手机版| 依依成人精品视频在线观看| 人妻激情偷一区二区三区| 影音先锋人妻啪啪av资源网站| 久久精品国产中文字幕|