I';我想了解Java';安全的随机对象
在学习初级加密课程时,我试图掌握Java的SecureRandom对象。我想我能理解的是: a) 无论你知道一个随机数序列有多长,都无法预测序列中的下一个随机数 b) 不管你知道一个随机数序列有多长,除了暴力猜测之外,没有办法知道哪个种子是用来启动它们的 c) 您可以请求各种大小的安全随机数 d) 您可以使用各种不同大小的值为新创建的SRNG设定种子。您创建的每个新创建的SRNG以及使用相同值的种子将生成相同的随机数序列 我应该补充一点,我假设此代码在Windows上使用:I';我想了解Java';安全的随机对象,java,random,cryptography,Java,Random,Cryptography,在学习初级加密课程时,我试图掌握Java的SecureRandom对象。我想我能理解的是: a) 无论你知道一个随机数序列有多长,都无法预测序列中的下一个随机数 b) 不管你知道一个随机数序列有多长,除了暴力猜测之外,没有办法知道哪个种子是用来启动它们的 c) 您可以请求各种大小的安全随机数 d) 您可以使用各种不同大小的值为新创建的SRNG设定种子。您创建的每个新创建的SRNG以及使用相同值的种子将生成相同的随机数序列 我应该补充一点,我假设此代码在Windows上使用: Random sr
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的流密码有多容易。但我建议不要在实践中使用它,因为它不是一个标准的密码构造,已经过专家审查,并且有合理的安全证明。记住加密的规则:
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”
相反一个问题有很多问题。不过我认为你的理解基本上是正确的。很抱歉问题太多了。这是我在这里的第一篇帖子。这些都是很好的答案