当前位置: 首页 > 知识库问答 >
问题:

跨版本和平台的一致随机数

程祯
2023-03-14

我需要/想要随机(不是全部)生成密码。

我的工作:目前我正在用SecureRandom生成它们
我正在使用

SecureRandom sec = SecureRandom.getInstance("SHA1PRNG", "SUN");

然后像这样播种

sec.setSeed(seed);

目标:一种(最好是快速)创建随机数的方法,这些随机数在密码学上至少和SHA1PRNG安全随机实现一样安全。这些在JRE和Android的不同版本上需要相同。

编辑:种子由用户输入生成。

问题:SecureRandom。getInstance(“SHA1PRNG”、“SUN”) 它失败如下:java。安全无此类例外:SUN。省略,“SUN”会生成随机数,但这些随机数与默认(JRE 7)数不同。

问题:我如何实现我的目标?

你不希望它是可预测的:我想要,因为我需要可预测性,这样相同的先决条件就会产生相同的输出。如果它们不一样,就很难做用户期望从应用程序中得到的事情。

编辑:可预测的意思是,当你知道一个字节(或一百个字节)时,你不应该能够预测下一个字节,但当你知道种子时,你应该能够预测第一个字节(以及所有其他字节)。也许另一个词是可以复制的。

如果有人知道更直观的方法,请告诉我!


共有3个答案

须捷
2023-03-14

如果你想预测,它们不是随机的。这打破了“安全”的“目标”要求,并转化为两台服务器之间的简单共享秘密。

你可以得到一些看起来有点随机,但可以通过使用素数的特征来预测的东西,在素数中,你从I(一些特定的整数)开始建立一组整数,然后加上第一个素数,然后用第二个素数取模。(事实上,第一个和第二个数字只需要相对质数——也就是说它们没有公共的质数因子——不包括1,如果你称之为因子的话。

如果你重复添加和做模的过程,你会得到一组你可以重复复制的数字,它们是有序的,也就是说,取集合中的任何一个成员,添加第一个素数,并通过第二个素数做模,你总是会得到相同的结果。

最后,如果第一个素数相对于第二个素数较大,那么这个序列不容易被人类预测,而且看起来有点随机。

例如,第一素数=7,第二素数=5(注意,这显示了它是如何工作的,但在现实生活中没有用)

从2开始。加7得到9。模5得到4。4加7等于11。模5=1。

序列是2,4,1,3,0,然后重复。

现在,对于现实生活中看似随机的数字生成。相对质数是91193和65536。(我选择第二个是因为它是2的幂,所以所有模值都可以适合16位。)

int first = 91193;
int modByLogicalAnd = 0xFFFF;

int nonRandomNumber = 2345; // Use something else
for (int i = 0; i < 1000 ; ++i) {
    nonRandomNumber += first;
    nonRandomNumber &= modByLogicalAnd;
    // print it here
}

每次迭代生成2字节的随机数。如果需要更大的随机“字符串”,可以将其中几个字符串打包到一个缓冲区中。

而且它们是可重复的。你的用户可以选择起点,你可以使用任何你想要的素数(或者,事实上,任何没有2作为因子的数字)。

顺便说一句,使用2的幂作为第二个数字会使它更容易预测。

司马宏邈
2023-03-14

我建议使用UUID。randomUUID(),然后使用GetLeastSignificanBits()和GetMostSignificanBits()将其拆分为long

梁丘赞
2023-03-14

我最终将Sha1Prng从太阳源中分离出来,这保证了Java和Android的所有版本的可重复性。我需要放弃一些重要的方法来确保与Android的兼容性,因为Android无法访问nio类...

 类似资料:
  • 问题内容: 我正在开发一种跨平台游戏,该游戏使用锁步模型在网络上播放。简要概述一下,这意味着只传达输入信息,并且在每个客户端的计算机上模拟所有游戏逻辑。因此,一致性和确定性非常重要。 我在使用GCC 4.8.1的MinGW32上编译Windows版本,在Linux上使用GCC 4.8.2进行编译。 最近让我吃惊的是,当我的Linux版本连接到Windows版本时,即使两台计算机上都编译了相同的代码

  • 问题内容: 给定初始整数参数,我需要生成受控的伪随机数序列。为此,我使用了标准的Java Random类,该类由整数参数设定。我想确保在可预见的将来(甚至更多),我将在整个系统(操作系统,还有Java / JDK版本)中生成相同的序列。 总结:Java是否可以确保其 实现 和 版本 之间的伪随机数生成器具有可再现性/可移植性? 问题答案: 是。 该javadoc的解释: 此类的实例用于生成伪随机数

  • 问题内容: 给定初始参数,我需要生成一个受控的伪随机数序列。为此,我使用了标准的python随机生成器,并以此参数作为种子。我想确保在整个系统(操作系统和Python版本)中生成相同的序列。 总结:python是否确保其 实现 和 版本 之间的伪随机数生成器具有可重复性/可移植性? 问题答案: 不,不是。模块的文档中没有这样的承诺。 该文档包含的内容是这样的: 在版本2.3中进行了更改:Merse

  • 我需要在Android/Ios的xamarin中使用camera/gallery。有办法吗?

  • 多平台支持 Mpx支持在多个小程序平台中进行增强,目前支持的小程序平台包括微信,支付宝,百度,qq和头条,不过自2.0版本后,Mpx支持了以微信增强语法为base的跨平台输出,实现了一套业务源码在多端输出运行的能力,大大提升了多小程序平台业务的开发效率,详情可以查看template增强特性 不同平台上的模板增强指令按照平台的指令风格进行设计,文档和代码示例为了方便统一采用微信小程序下的书写方式。

  • 从版本4.3.0开始,Cordova提供了保存和恢复平台和插件的能力。 这个特性允许开发者保存和恢复他们的app到一个已知的状态,而不用去检测所有平台和插件的源代码。 'save'命令存储app平台和插件的详细版本信息到config.xml里面。当一个'cordova prepare'命令发出,通过利用先前保存在config.xml里面的信息, 'restore'步骤就会自动执行。 下面场景,sa