I';我想了解Java';安全的随机对象

I';我想了解Java';安全的随机对象,java,random,cryptography,Java,Random,Cryptography,在学习初级加密课程时,我试图掌握Java的SecureRandom对象。我想我能理解的是: a) 无论你知道一个随机数序列有多长,都无法预测序列中的下一个随机数 b) 不管你知道一个随机数序列有多长,除了暴力猜测之外,没有办法知道哪个种子是用来启动它们的 c) 您可以请求各种大小的安全随机数 d) 您可以使用各种不同大小的值为新创建的SRNG设定种子。您创建的每个新创建的SRNG以及使用相同值的种子将生成相同的随机数序列 我应该补充一点,我假设此代码在Windows上使用: Random sr

在学习初级加密课程时,我试图掌握Java的SecureRandom对象。我想我能理解的是:

a) 无论你知道一个随机数序列有多长,都无法预测序列中的下一个随机数

b) 不管你知道一个随机数序列有多长,除了暴力猜测之外,没有办法知道哪个种子是用来启动它们的

c) 您可以请求各种大小的安全随机数

d) 您可以使用各种不同大小的值为新创建的SRNG设定种子。您创建的每个新创建的SRNG以及使用相同值的种子将生成相同的随机数序列

我应该补充一点,我假设此代码在Windows上使用:

Random sr = SecureRandom.getInstance("SHA1PRNG", "SUN");
我的基本理解正确吗?提前谢谢

我还有一些问题要问那些相当精通加密技术的人。它们与播种SRNG有关,而不是让它在首次使用时自行播种

e) 如果使用一个长整数(而不是一个8字节的数组)为SRNG种子,那么生成的随机数会有什么不同(如果有的话)

f) 如果我给一个SRNG设定种子,比如256字节,有没有其他种子可以产生相同的随机数序列

g) 是否存在某种最佳种子大小?在我看来,这可能是一个毫无意义的问题

h) 如果我通过植入一个SRNG(比如256字节)来加密明文,然后让它生成随机字节,与明文中的字节进行异或,那么窃听者解密生成的密文有多容易?需要多长时间?我是否认为窃听者必须知道、猜测或计算256字节的种子

我已经看了前面关于SecureRandom的问题,似乎没有一个能回答我特别关心的问题。 如果这些问题中有任何一个看起来过于愚蠢的话,我想重申一下,我在研究这个领域时是个新手。如果您能提供任何意见,我将不胜感激,因为我想了解Java SecureRandom对象在密码学中是如何使用的。

e)我不认为这有什么区别。假设长数组和8字节数组包含相同的数据

f) 原则上是的。如果您的种子大于RNG的内部状态,则可能存在其他种子,这些种子将导致相同的内部状态。如果种子小于状态,则不应存在。我不知道SecureRandom的内部状态是什么样子

g) 重要的不是种子的大小;这是其中的熵。你需要在你的种子中有至少与你期望的RNG安全性一样多的熵;我不太确定这里有哪些最佳实践

h) 我不确定打破你提议的基于RNG的流密码有多容易。但我建议不要在实践中使用它,因为它不是一个标准的密码构造,已经过专家审查,并且有合理的安全证明。记住加密的规则:

  • 永远不要设计自己的密码
  • 永远不要实现自己的加密
  • 任何人都可以设计密码,他们不能破坏自己
  • d) 这对于PRNG是正确的。对于CSRNG来说,这并不总是正确的。阅读
    SecureRandom.setSeed()
    的Javadoc:“给定的种子补充而不是替换现有的种子。因此,重复调用保证永远不会减少随机性。”

    任何合理的CSRNG都会有您无法明确控制的“无形”熵源,通常是从操作系统级别获取的各种内部参数。因此,种子设定比显式传递给RNG的任何数字都要多。

    好,顺序如下:

    a) 正确的

    b) 正确的

    c) 正确,您甚至可以使用
    nextInt(n)

    d) 正如正确的一样:SHA1PRNG的实现没有被任何算法公开定义,并且有迹象表明该实现在时间上发生了变化,因此这仅适用于Sun提供程序,然后仅适用于特定的运行时配置

    e) 由于API清楚地表明使用了long中的所有字节(“使用给定long种子中包含的八个字节”),因此在添加到状态中的熵量方面不应有任何差异

    请注意,快速检查显示
    setSeed(long)
    的行为与
    setSeed(字节[])完全不同
    主要区别在于
    long
    值的种子始终与从系统检索到的随机性混合在一起,即使它是构建
    SecureRandom
    实例后的第一次调用

    f) 是-无限多个种子生成相同的流;因为使用了哈希函数,所以不可能找到一个

    g) 如果混合了额外的熵,则熵越大越好,但没有最小值;如果将其用作唯一的种子,则不应以少于20字节的种子开始,也就是说:如果希望使种子保持与PRNG内部状态相同的安全约束

    我想补充一点,如果你使用的熵小于64字节,那么你肯定处于危险区域。请注意,1位熵并不总是意味着一个字节中的1位。大小为8的字节数组可能具有64位或更少的熵


    h) 这基本上是一种基于散列的流密码;它是安全的,因此攻击者几乎没有机会(如果您不重用种子),但它是一种非常不可靠(请参见答案d)且速度很慢的流密码,因此请永远不要这样做-使用
    密码
    “AES/CTR/NoPadding”
    “AES/GCM/NoPadding”
    相反

    一个问题有很多问题。不过我认为你的理解基本上是正确的。很抱歉问题太多了。这是我在这里的第一篇帖子。这些都是很好的答案