在Java

时间:2016-04-01 19:09:06

标签: java security random

我需要编写一个生成器,它将生成一个用于双因素身份验证实现的8位数字。目前我在辩论:

  • 在0到9之间生成8个随机数字并创建包含这些数字的字符串
  • 生成介于10000000和99999999之间的随机数

两种方法之间唯一明显的区别是,首先允许第一个数字为0,但我不确定第二种方法的更宽范围是否更安全。

除非有更好的方法,否则这两种方法都将涉及使用SecureRandom。我使用的是Java 6。

大多数双因素身份验证服务如何生成代码?哪种方法更安全和/或被认为是更好的做法,或者无关紧要?

1 个答案:

答案 0 :(得分:0)

创建随机数不会有帮助。大多数(如果不是全部)开源实现(包括Google和Microsoft OTP)使用基于时间的OTP,该OTP在RFC 6238中定义。这是一个应用于时间戳的HMAC函数(通常以30秒的间隔划分)

维基百科页面提供了很多有关其工作原理和算法的信息:https://en.wikipedia.org/wiki/Time-based_One-time_Password_Algorithm。您还会找到大量可供您计算的开源库。

我忘了添加

整个系统将与您存储任何主密钥的位置以及分发给客户的各个种子密钥一样安全。如果密钥易于访问,系统将不再安全。