当前位置: 首页 > 面试题库 >

Java随机UUID是否可预测?

马博学
2023-03-14
问题内容

我想对数据库中的敏感数据使用加密安全的主密钥-这是无法猜测/可预测的,并且不能由数据库生成(在持久存储对象之前,我需要密钥)。

我了解Java使用带有加密安全随机数生成器的4型UUID,但是我知道UUID并不是完全随机的,所以我的问题是,假设无法从一组现有的uuid中预测uuid,这有多安全?


问题答案:

好吧,如果您想知道UUID的随机性,则必须查看源。

以下代码部分摘自OpenJDK7(与OpenJDK6相同):

public static UUID randomUUID() {
        SecureRandom ng = numberGenerator;
        if (ng == null) {
            numberGenerator = ng = new SecureRandom();
        }

        byte[] randomBytes = new byte[16];
        ng.nextBytes(randomBytes);
        randomBytes[6]  &= 0x0f;  /* clear version        */
        randomBytes[6]  |= 0x40;  /* set to version 4     */
        randomBytes[8]  &= 0x3f;  /* clear variant        */
        randomBytes[8]  |= 0x80;  /* set to IETF variant  */
        return new UUID(randomBytes);
    }

如您所见,16个字节中只有2个不是完全随机的。在第六个字节中,您丢失8位中的4位,在字节8中,您失去2位随机性。

因此,您将获得具有122位随机性的128位值。

操作可能引起的唯一问题是,很有可能将您的数据识别为UUID。因此,如果您想将其隐藏在其他随机数据中,将无法使用…



 类似资料:
  • 问题 你需要生成在一定范围内的随机数,但你也需要对发生器进行“生成种子”操作来提供可预测的值。 解决方案 编写你自己的随机数生成器。当然有很多方法可以做到这一点,这里给出一个简单的示例。 该发生器绝对不可以以加密为目的! class Rand # 如果没有种子创建,使用当前时间作为种子 constructor: (@seed) -> # Knuth and Lewis' impro

  • 问题内容: 当他每次运行程序时都不断获得相同的数字时,我试图向Java解释随机数生成器。我为同一件事创建了自己的简单版本,每次运行该程序时,我也得到了与他得到的确切数字相同的数字。 我究竟做错了什么? 100个数字中的最后五个数字是: 问题答案: 您已经为随机数生成器提供了恒定的值。它是确定性的,因此每次运行都会生成相同的值。 我不确定您为什么选择使用作为种子,但是种子值与生成的值范围无关(这是由

  • 问题内容: 我正在尝试在Java中生成盐,以与用于安全密码存储的哈希算法配合使用。我正在使用以下代码创建随机盐: 这应该生成一个完全安全的,随机生成的盐,以用于我的哈希算法。但是,当我运行代码时,每次都会输出相同的盐…表示生成的盐根本不是随机的。 出于明显的安全性目的,每个用户都需要一个唯一的符号,但是如果我每次创建一个新帐户时都使用此代码,则每个用户都将具有相同的符号,这一开始就破坏了它的用途。

  • 我目前正在将BigQuery表提取到Google Cloud Storage中的分片. csv中——有什么方法可以对提取的行进行洗牌/随机化吗?GCS. csv将用作GCMLE模型的训练数据,当前的导出是非随机顺序的,因为它们被类似的“标签”捆绑在一起。 这会在培训GCMLE模型时产生问题,因为您必须随机提交每个批次中所有标签的模型示例。而GCMLE/TF能够随机化单个数据行的顺序。csv的,但据

  • 问题内容: 我有一个基于Web的Java应用程序,该应用程序会为会话信息生成随机的UUID。我们的一名测试人员声称可以根据自己的分析来产生最长350ms的时间来生成UUID,但我仍无法复制他的结果。他指向这篇文章http://www.cowtowncoder.com/blog/archives/2010/10/entry_429.html来帮助备份他的结果。我想看看是否有人在Java 6或Java

  • 问题内容: 例如,可以将其用于生成一次性填充密钥吗? 另外,它的来源是什么,如何将其用于生成 x 和 y 之间的随机数? 问题答案: 在这个宇宙中,唯一可以真正考虑的是基于量子效应的宇宙。常见的例子是放射性衰变。对于某些原子,您只能确定其半衰期,但不能确定下一个原子核会破裂。 关于-取决于实现。在Linux中,它用作熵源: Linux内核根据键盘时序,鼠标移动和IDE时序生成熵,并通过特殊文件/