【问题标题】:Generating 128 bit random key in java在java中生成128位随机密钥
【发布时间】:2014-06-29 17:06:42
【问题描述】:

我想在 java 中生成一个 128 位的随机密钥。我正在使用以下内容:

byte[] byteBucket = new byte[bytelength];
randomizer.nextBytes(byteBucket);

我的字节数组长度是 16 作为 (16*8=128) 还是 128?

【问题讨论】:

    标签: java random


    【解决方案1】:

    试试 SecureRandom API。

    SecureRandom random = new SecureRandom();
    byte bytes[] = new byte[16]; // 128 bits are converted to 16 bytes;
    random.nextBytes(bytes);
    

    【讨论】:

    • 数组长度不是 16 就是 17 个元素吗?
    • 新字节[16] 将包含 16 个元素。它们的索引是 0 到 15
    【解决方案2】:

    UUID

    有一个类叫java.util.UUID,用method生成random-basedUUID。这个128-bit 值有122 位随机生成。

    UUID uuid = UUID.randomUUID() ;
    

    调用toString 以将值视为插入连字符的规范格式的十六进制字符串。

    uuid.toString(): 24b47cf5-fb53-4fb1-a5a2-8b415260304d

    您可以将 128 位提取为一对 64 位 long 整数。致电getMostSignificantBits()getLeastSignificantBits()

    long mostSignificant = uuid.getMostSignificantBits() ;
    long leastSignificant = uuid.getLeastSignificantBits() ;
    

    此值可能不适用于 4 位可预测(非随机)的关键安全应用程序。但在其他实际应用中,这个方便的类可能会很好用。

    这是我在 SO 上找到的一个问题,有更详细的解释:Likelihood of collision using most significant bits of a UUID in Java

    【讨论】:

    • java.util.UUID/randomUUID 不适用于通用的 128 位随机数生成,因为它只生成 122 个随机位。见en.wikipedia.org/wiki/…
    • @DavidJames 请解释更多,因为它在 UUID 的 javadocs 中提到“表示不可变的通用唯一标识符 (UUID) 的类。UUID 表示 128 位值。”我知道它实际上只生成 122 位。但它在世界范围内也是独一无二的,不是吗?
    • 两个 cmets 都是正确的:仅在基于随机的 UUID 中,128 位中的 122 位是随机生成的。所以从技术上讲,不符合问题中提出的 128 位随机性。但实际上,在现实世界的工作中,两者发生碰撞的机会几乎相同:几乎为零。对于关键安全应用程序,随机 UUID 可能不合适,但对于其他非关键应用程序,随机 UUID 效果很好,并且只需使用内置 Java 类的一小段代码就可以方便地使用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-05
    • 1970-01-01
    • 1970-01-01
    • 2018-09-10
    • 2015-09-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多