gpt4 book ai didi

java - 如何生成 key 以获得 HMAC SHA512 的 TOTP 符合 RFC6238 和 RFC4086?

转载 作者:行者123 更新时间:2023-12-05 01:16:39 33 4
gpt4 key购买 nike

我必须向 URL http://example.com/test 发出 HTTP POST 请求其中包含作为正文部分的 JSON 字符串、标题“Content-Type:application/json”和“Authorization: Basic userid:password”。用户 ID 是 abc@example.com,密码必须是 10 位基于时间的一次性密码,符合 RFC6238 TOTP,使用 HMAC-SHA-512 作为哈希函数。

token 共享 key 应为“abc@example.comTEXT5”,不带双引号。

所以,为了实现上述,我修改了 RFC6238 RC6238 TOTP Algo 的 Java 代码

为了获得 TOTP,我使用 online converter tool 将共享 key “abc@example.comTEXT5”转换为 HMAC-SHA512以及一些生成相同的 128 个字符长度的 HEX 代码的代码

发出请求时总是响应“TOTP 错误”。

我注意到我生成了错误的 key ,所以 TOTP 错误。那么,如何生成符合 HMAC-SHA512 和 RFC6238 算法的 Java 代码的正确 key 呢?

算法中有默认 key 作为种子:

String seed64 = "3132333435363738393031323334353637383930" +
"3132333435363738393031323334353637383930" +
"3132333435363738393031323334353637383930" +
"31323334";

如何为我的共享 key “abc@example.comTEXT5”获取这样的种子 64?我修改后的代码是10 digit TOTP

感谢大家的帮助!

最佳答案

Appendix A of RFC 6238 中的示例 64 字节种子是 Appendix B 中提供的 ASCII secret 12345678901234567890 的 HEX 编码版本,其中包含真值表。

ASCII 1  2  3  4  5  6  7  8  9  0  1  2  3  4  5  6  7  8  9  0
HEX 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35 36 37 38 39 30

如果您想使用相同的模式转换您的共享 key ,如果您使用附录 A 中提供的示例代码,您可以将 abc@example.comTEXT5 转换为字符串格式的 HEX。

这将变成以下十六进制字符串:

616263406578616D706C652E636F6D5445585435

为了构建用于 SHA-512 散列的 64 字节种子示例,重复最初的 20 个字节以使总共 64 个字节,以实现 SHA-512 散列的最佳 key 长度。

对您的示例字符串执行相同操作会产生以下种子:

String seed64 = "616263406578616D706C652E636F6D5445585435" +
"616263406578616D706C652E636F6D5445585435" +
"616263406578616D706C652E636F6D5445585435" +
"61626340";

如果您使用示例代码的其余部分来计算时间步长并请求 10 位 TOTP 代码,我认为它会为您工作。

如果您在生产中使用类似的东西,您可能希望使用更随机生成的 key 。

例如,要为 SHA-512 生成 64 字节 key ,您可以执行以下操作:

  public static String generateRawSecret(int length) {
byte[] buf = new byte[length];
new SecureRandom().nextBytes(buf);
String rawSecret = Base64.getEncoder().encodeToString(buf);
return rawSecret.substring(1, length + 1);
}

// Random 64 byte secret
String secret = generateRawSecret(64);

看起来您已经编写了大部分代码,但如果您正在寻找一些额外的 Java 示例,以下链接是一个 GitHub 项目,它有一个简单的实用程序类和一堆测试。 https://github.com/FusionAuth/fusionauth-2FA

关于java - 如何生成 key 以获得 HMAC SHA512 的 TOTP 符合 RFC6238 和 RFC4086?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52964323/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com