【问题标题】:getting deterministic values with java's securerandom使用 java 的 securerandom 获取确定性值
【发布时间】:2023-04-06 10:44:02
【问题描述】:

我试图根据种子值每次都获得相同的盐值。这是我的代码

SecureRandom sr = new SecureRandom(seed.getBytes());
byte[] salt = new byte[32];
sr.nextBytes(salt);

但是,每次运行时我都会得到不同的值。是不是我做错了什么?

更新:

好的,我尝试使用 random 代替 secureRandom 并使用长种子获取字节,但每次我仍然得到不同的值。但是,当我更改它以尝试获取 nextInt 时,我能够获得相同的值。

Random rand = new Random(Long.parseLong(seed, 36));   
byte[] salt = new byte[32];
rand.nextBytes(salt); 

是否有解决方法正确获取相同的字节?

【问题讨论】:

  • 您似乎缺少“SecureRandom”中的“Secure”...
  • @BrettOkken 我了解secureRandom 提供了更好的安全性,但对于我的应用程序而言,每次为哈希函数的给定输入生成相同的哈希结果非常重要。这就是为什么我想得到相同的盐的原因

标签: java hash salt


【解决方案1】:

这是故意的。 SecureRandom 尝试使用熵来获得真正的随机性,顺便说一下,这可能很昂贵。不管你开始用什么盐,它总是会返回不同的值。

如果您想要确定性值,请改用 Random。

【讨论】:

  • 谢谢。我只是尝试使用随机函数,但每次运行它时我仍然得到不同的值。这是我的代码: Random random = new Random (Long.parseLong(seed,36));字节[]盐=新字节[32]; random.nextBytes(盐);有什么我想念的吗?
  • 也许您的种子有问题?用硬编码常量替换 parseLong 代码并运行程序。您应该每次都获得相同的值。如果可行,您可以调查为什么种子会发生变化。我根据您的代码和 new Random(1000L) 编写了一个简短的程序,它始终产生相同的字节!
  • 谢谢。我像你一样用新的 Random(1000L) 替换了 parseLong 代码,但由于某种原因,我仍然得到不同的值。它看起来完全像这样:Random random = new Random (1000L);字节[]盐=新字节[32]; random.nextBytes(salt);
  • 您确定您运行的是新代码而不是旧版本吗?如果是这样,您使用的是什么平台?您可以尝试使用不同的 JDK。听起来像是一个非常不可能的错误,但是当我在循环中运行您最新评论中的代码时,它每次都会产生相同的字节。
  • 我正在使用 Eclipse,当我在循环中运行它时,我也得到了与该循环相同的结果。但是,当我再次运行代码时,我在循环中得到相同的值,但与上一次运行不同。
猜你喜欢
  • 1970-01-01
  • 2015-02-22
  • 1970-01-01
  • 2014-11-20
  • 2017-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多