【问题标题】:Generate secure random number of a specific length in Java [duplicate]在Java中生成特定长度的安全随机数[重复]
【发布时间】:2016-04-01 19:09:05
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 超级简单,google 可以帮忙吗?
  • 随机函数允许您设置要在其中生成数字的范围。将其与将每个数字分配给数组/向量中的位置的循环结合起来,您就有了工作程序。
  • 在处理代码时最好扩大搜索空间。不用在每个地方都使用 0-9,您会显着减少搜索空间。
  • 由于您使用的是SecureRandom,这两种方法都会为您提供相同的随机性。在第二种方法中,您可以创建从 0 到 99999999 的数字,然后用零填充它。找不到原因你应该忽略这个范围..

标签: java security random


【解决方案1】:

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

维基百科页面上有很多关于其工作原理和算法的好信息:https://en.wikipedia.org/wiki/Time-based_One-time_Password_Algorithm。您还会发现大量的开源库可以为您计算这一点。

忘记加了

整个系统将与您存储任何主密钥和分发给客户的各个种子密钥的地方一样安全。如果密钥易于访问,系统将不会更加安全。

【讨论】:

  • 我在问题中看不到任何对“服务器”的引用。只是对“服务”的引用。此外,两因素身份验证解决方案在服务器之间没有意义,您有更强大的解决方案,例如 PKI,它更易于实施。
  • NP :) - 这是双重身份验证的基础:1)您知道的东西(您的密码)- 2)您拥有的东西(移动/OTP 生成器/等)。
猜你喜欢
  • 1970-01-01
  • 2011-07-20
  • 2015-02-10
  • 2015-09-13
  • 2020-03-11
  • 1970-01-01
  • 1970-01-01
  • 2018-09-14
  • 2012-05-04
相关资源
最近更新 更多