【问题标题】:Generate unique key in Java在Java中生成唯一键
【发布时间】:2016-08-04 06:55:14
【问题描述】:

我们正在将使用 NodeJ 编码的服务器项目迁移到使用 Java 编码的服务器项目。我对密码学不是很感兴趣,但我需要将以下指令“翻译”成 Java。

crypto.randomBytes(32).toString('hex');

基本上在 node js 项目中,他们使用 js 库 crypto 来生成唯一密钥,我需要在 java 中做同样的事情,不多也不少。 有加密知识的人可以在这里提供帮助吗? Java 中的等价物是什么?

谢谢

【问题讨论】:

  • 嗯,也许是 SecureRandom

标签: javascript java node.js cryptography


【解决方案1】:

你可能会使用这样的东西

import java.util.uuid;
...

UUID  newUUID = UUID.randomUUID();

String.valueOf(newUUID);

...

【讨论】:

    【解决方案2】:

    你可以使用

    Random.nextBytes(byte[] bytes) 
    

    填充一个随机字节数组,然后使用here讨论的策略将字节转换为十六进制

    【讨论】:

    • Random 不提供加密安全的随机字节。应该改用SecureRandom。
    • 他没有用它来加密。他只需要一个随机的 UUID。
    • 与Random 的冲突可能太高而无法将结果称为“唯一”。无论如何,UUID also uses SecureRandom internally.
    • nextBytes 的实现在此处记录:docs.oracle.com/javase/7/docs/api/java/util/… 所以本质上它为每个字节调用 nextInt()。我不会假装对密码学有足够的了解,以知道与 SecureRandom 实现的其他方法相比,这会产生多少熵。话虽如此,我怀疑这个实现会有很多冲突。
    【解决方案3】:

    您可以使用 java 中的 UUID:

    UUID.randomUUID()
    

    通过在谷歌上的快速搜索,我得到了https://paragonie.com/blog/2016/05/how-generate-secure-random-numbers-in-various-programming-languages,看看你的情况,最接近的是:

    SecureRandom csprng = new SecureRandom();
    byte[] randomBytes = new byte[32];
    csprng.nextBytes(randombytes);
    

    这是在博客中。 希望对您有所帮助。

    【讨论】:

    • would need to do the same, no more, no less
    • 好的,你想实际传递字节数并生成密钥
    • 是的,这会生成一个唯一的密钥。这个答案是正确的。
    【解决方案4】:

    试试这个:

    SecureRandom random = new SecureRandom();
    new BigInteger(256, random).toString(32);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-28
      • 2018-07-27
      • 2019-02-02
      • 2014-11-28
      相关资源
      最近更新 更多