如果我需要将OTP存储在数据库中,那么TOTP如何工作?

时间:2018-12-26 11:12:27

标签: java one-time-password totp

我有一个要求

  1. 第三方提供商(TPP)希望使用OTP访问Rest Endpoint。
  2. 因此,TPP请求一个service1,该服务又调用一个生成OTP的service2,将与该请求相关的用户特定数据存储在该OTP中,并将OTP返回给TPP。这些OTP的有效时间为n次,例如。 6分钟到目前为止一切顺利,现在我在下面的问题

  3. 我只能生成6位数的OTP。我正在使用Java.Crypto.mac。我收到许多重复的OTP。最好的算法是什么,这样可以减少获取重复项的可能性。我从https://github.com/jchambers/java-otp/blob/master/src/main/java/com/eatthepath/otp/HmacOneTimePasswordGenerator.java

  4. 那里得到了提示

使用相同的逻辑。我使用jmeter对单线程进行了测试,进行了5000次,我得到了近500个重复的OTP

  1. 我已经阅读到TOTP以客户端服务器方式工作。我不了解在这种情况下没有这样的客户。有没有一种方法可以不将OTP存储在数据库中?

  2. 如果我将它们保留在DB中,那么在某些时候所有的OTP都将耗尽。

我已经阅读了几乎所有有关XOR128,TOTP,HOTP的文章,但是有些东西我想了解。请帮我解决这个问题。

1 个答案:

答案 0 :(得分:0)

我看到了几种可能的方法。

第一个是TOTP,您根本不需要存储OTP,只需存储一个密钥即可,该密钥将用于生成OTP。

第二个选项(通常使用)是为您的客户端提供API密钥,并且每当他们发送请求时,它们都需要使用某种哈希算法来生成访问密钥。哈希函数的来源应为包含API密钥和当前时间步长的字符串。 这是来自顶级OTP提供商之一的API指令,您可以在第5页“授权”中找到上述方法的示例:https://www.protectimus.com/images/pdf/Protectimus_API_Manual_en.pdf