Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是Java';默认情况下,密钥生成器是否随机安全?_Java_Cryptography_Key Generator - Fatal编程技术网

是Java';默认情况下,密钥生成器是否随机安全?

是Java';默认情况下,密钥生成器是否随机安全?,java,cryptography,key-generator,Java,Cryptography,Key Generator,下面这行代码通过jdk的KeyGenerator生成一个sha512密码 SecretKey secretKey = KeyGenerator.getInstance("HmacSHA512").generateKey(); 我想知道随机密钥是否安全 或者,在生成密钥之前,我是否应该使用SecureRandom实例显式初始化生成器?为了完整起见,您可以使用512位的密钥大小调用init方法。但是,HMAC的默认密钥大小与输出的大小相同。因此,从这个意义上说,假设这个密钥大小是默认设置的是非常合

下面这行代码通过jdk的
KeyGenerator
生成一个sha512密码

SecretKey secretKey = KeyGenerator.getInstance("HmacSHA512").generateKey();
我想知道随机密钥是否安全


或者,在生成密钥之前,我是否应该使用
SecureRandom
实例显式初始化生成器?

为了完整起见,您可以使用512位的密钥大小调用
init
方法。但是,HMAC的默认密钥大小与输出的大小相同。因此,从这个意义上说,假设这个密钥大小是默认设置的是非常合理的。实际上,应该避免使用常量值调用
init
方法

至于实现,如果不显式调用
init
方法,则很可能假定默认值,并选择
SecureRandom
实例。但是,您是正确的,因为这是一个逻辑提供程序默认值;它应该被指定为对所有供应商的要求


从这里发生的事情中可以得到一些想法。所有的提供程序代码都是在线的,因此没有找到它取决于没有深入研究,尽管你需要一些Google foo来找到它。

阅读javadoc:它回答了你的问题:所有密钥生成器都有密钥大小和随机性源的概念。这个KeyGenerator类中有一个init方法,它接受这两种通用的共享参数类型。还有一种仅接受一个keysize参数,并使用最高优先级安装的提供程序的SecureRandom实现作为随机性源(如果没有安装的提供程序提供SecureRandom实现,则使用系统提供的随机性源),还有一种仅接受随机性源。@JBNizet So,对于
HmacSHA512
您能说出问题答案的简单版本吗?请再次阅读。小心还有一种方法只接受一个keysize参数,并使用安装的最高优先级提供程序的SecureRandom实现作为随机性的来源。什么是不清楚的?如果不使用SecureRandom进行初始化,它将使用安装的最高优先级提供程序的SecureRandom实现作为随机性的来源。这不是你的问题吗?这是怎么回事?@JBNizet结果键是512位,因为它是SHA512,在这种情况下,keysize参数是什么…来自javadocs:如果客户端没有显式初始化KeyGenerator(通过调用init方法),每个提供程序都必须提供(并记录)默认初始化。所以它变成了特定于提供商的,猜猜怎么着?该文档并没有真正记录这一方面。因为我不喜欢默认值,所以我建议你总是调用
init()
方法。我在jdk源代码中做了一个调试,如果没有调用
init()
,那么random首先为null,然后在
KeyGeneratorCore
implicGenerateKey()
方法中,它将调用
SunJCE.getRandom()
来初始化随机值,这将得到一个属于
SunJCE$SecureRandomHolder
类的
static final
random。因此,它确实有一个随机变量,这个随机变量作为默认随机变量在jvm之间共享。通过回答中的提示,我还发现了
HmacCore
HmacCore$HmacSHA512
,它们是
HmacSHA512
算法的实现。我只关心一个问题,使用jvm范围内的共享
SecureRandom
实例是否是一种好的做法,或者最好由开发人员在每次生成密钥时指定一个新实例?我查看了这篇文章,其中的答案有不同的观点:随机生成器很难理解主题。幸运的是,一个种子良好的CSPRNG不太可能那么脆弱。因此,只要您使用一个,并且不自己提供初始种子,它应该是相当安全的(不管怎样,在台式机和服务器上,嵌入式CPU都有点棘手)。就我个人而言,我要么使用默认设置,不提供特定的RNG,要么使用
SecureRandom.getInstanceStrong()
作为长期密钥,要么使用BSI AIS 31或FIPS验证的硬件设备(最后一个可能不适用于您:P);它们并不都那么伟大,而且公认的答案包含错误的信息。