相同的随机保证

时间:2015-06-26 14:03:28

标签: java random

我有这段代码:

BigInteger bigInteger = new BigInteger(64, new Random());
Long longValue=-Math.abs(bigInteger.longValue());
int desiredLen=384;
Random random=new Random(longValue);
byte [] randomString=new byte[desiredLen];
for(int i=0;i<desiredLen;i++)
    randomString[i]=(byte)(Math.abs(random.nextInt())&255);

现在有以下值:

  • longValue - 发送到另一方(服务器),后来用于在另一侧再次生成密钥
  • randomString - 是基于longValue
  • 随机生成的加密密钥

简单地说,客户端发送包含前8个字节longValue的消息,其他内容是randomString加密的内容。

根据收到的longValue,在所有物理机和虚拟机以及所有Java版本上生成完全相同的数字的保证是什么?如果客户端是用C#等其他语言编写的呢?

1 个答案:

答案 0 :(得分:1)

java.util.Random的API文档指定了所使用的确切算法。

这不是铸铁保证,事情不会改变,不像方法的签名那么多,但是你在API文档中发布的任何实现细节几乎都是有约束力的。当然,甲骨文极不可能改变它。

你是否认为对你来说足够了取决于你。

我个人不会依赖它,不是因为它可能会改变,而是因为它引入了一种可能不会立即明显的依赖性。 决定还应取决于任务的重要性。如果它是一个业余爱好项目,它可能没关系,如果它是银行间的通信,我甚至根本不会考虑使用Random,因为它不具有加密安全性。

至于与其他语言的互操作性,无法保证。