簡體   English   中英

Java - TOTP 算法,從 HMAC SHA1 到 HMAC SHA256

[英]Java - TOTP algorithm, from HMAC SHA1 to HMAC SHA256

請提出有關 TOTP 生成算法的小問題。

我正在構建一個 TOTP 生成算法。 為此,我使用了 HMAC SHA1。 結果是正確的,我多次使用這個 HMAC SHA1 生成的 TOTP 來向服務器驗證我自己,我確認了 TOTP 是正確的,非常高興。

現在,知道 HMAC SHA1 不太安全,我想從 HMAC SHA1 遷移到 HMAC SHA256。

我以為我就像改變HMAC算法一樣簡單。 不幸的是,服務器不接受所有使用 HMAC SHA256 生成的 TOTP。

只是強調一下,這個問題是關於如何使其與 HMAC SHA256 一起使用。

這個問題不是關於:

  • HMAC SHA1 的安全性如何
  • 如果從 HMAC SHA1 遷移到 HMAC256 是一個不錯的選擇
  • 如何更改服務器以接受 HMAC256 生成的 TOTP。

這個技術問題實際上是關於使用 HAMC SHA256 生成 TOTP 的技術算法。

我用來生成 HMAC SHA1 TOTP 的代碼是:

String getTOTP() {
        try {
            long value = LocalDateTime.now().atZone(ZoneId.systemDefault()).toInstant().toEpochMilli() / TimeUnit.SECONDS.toMillis(30);
            final byte[] key = new Base32().decode("the_password".toUpperCase(Locale.US));
            final var data = new byte[8];
            for (int i = 8; i-- > 0; value >>>= 8) {
                data[i] = (byte) value;
            }
            final var signKey = new SecretKeySpec(key, "HmacSHA1"); // would like to change here to "HmacSHA256"
            final var mac = Mac.getInstance("HmacSHA1"); // would like to change here to "HmacSHA256"
            mac.init(signKey);
            final String hashString = new String(new Hex().encode(mac.doFinal(data)));
            final var offset = Integer.parseInt(hashString.substring(hashString.length() - 1), 16);
            final var truncatedHash = hashString.substring(offset * 2, offset * 2 + 8);
            final var finalHash = String.valueOf(Integer.parseUnsignedInt(truncatedHash, 16) & 0x7FFFFFFF);
            final var finalHashCut = finalHash.substring(finalHash.length() - 6);
            System.out.println("THE TOTP generated with HmacSHA1 is  " + finalHashCut);
            System.out.println("THE TOTP generated with HmacSHA256 will not work though :'( ");
            return finalHashCut;
        } catch (NoSuchAlgorithmException | InvalidKeyException e) {
            LOGGER.warn("", e);
            return "";
        }
    }

問題:為了讓 TOTP 使用 HMAC SHA256,我應該調整算法的哪些元素,並且仍然可以工作?

謝謝你。

感謝 Robert 的評論,更改哈希值將更改輸出。

除非目標服務器接受其他散列算法,否則更改客戶端上的散列將產生不同的 TOTP,並且不會被服務器接受。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM