java安全密钥_Java安全性:密钥大小或默认参数非法?

我早些时候曾问过一个问题,但没有得到正确的回答,也无济于事。

因此,我澄清了有关该问题的一些细节,我真的很想听听您关于如何解决此问题或应该尝试的想法。

我在Linux服务器上安装了Java 1.6.0.12 ,下面的代码运行得很完美。

String key = "av45k1pfb024xa3bl359vsb4esortvks74sksr5oy4s5serondry84jsrryuhsr5ys49y5seri5shrdliheuirdygliurguiy5ru";

try {

Cipher c = Cipher.getInstance("ARCFOUR");

SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes("UTF-8"), "ARCFOUR");

c.init(Cipher.DECRYPT_MODE, secretKeySpec);

return new String(c.doFinal(Hex.decodeHex(data.toCharArray())), "UTF-8");

} catch (InvalidKeyException e) {

throw new CryptoException(e);

}

今天,我在服务器用户上安装了Java 1.6.0.26 ,当我尝试运行应用程序时,出现以下异常。 我的猜测是它与Java安装配置有关,因为它在第一个版本中有效,但在更高版本中不起作用。

Caused by: java.security.InvalidKeyException: Illegal key size or default parameters

at javax.crypto.Cipher.a(DashoA13*..) ~[na:1.6]

at javax.crypto.Cipher.a(DashoA13*..) ~[na:1.6]

at javax.crypto.Cipher.a(DashoA13*..) ~[na:1.6]

at javax.crypto.Cipher.init(DashoA13*..) ~[na:1.6]

at javax.crypto.Cipher.init(DashoA13*..) ~[na:1.6]

at my.package.Something.decode(RC4Decoder.java:25) ~[my.package.jar:na]

... 5 common frames omitted

第25行是: c.init(Cipher.DECRYPT_MODE, secretKeySpec);

笔记:

*服务器1.6.0.12 java目录上的java.security与1.6.0.26 java.security文件几乎完全匹配。 第一个中没有其他提供程序。

*上一个问题在这里 。

#1楼

对于JAVA 7,下载链接为jce-7-download

将两个下载的jar复制到Java \\ jdk1.7.0_10 \\ jre \\ lib \\ security中

备份较旧的罐子,以确保安全。

对于JAVA 8,下载链接为jce-8-download

将下载的jar复制到Java \\ jdk1.8.0_45 \\ jre \\ lib \\ security中

备份较旧的罐子,以确保安全。

#2楼

可以在以下位置找到JRE / JDK / Java 8管辖区文件:

就像詹姆斯在上面说的那样:

将文件安装在${java.home}/jre/lib/security/ 。

#3楼

问题是如果安装JRE,则文件夹jre \\ lib \\ security中local_policy.jar中文件default_local.policy的内容 :

// Some countries have import limits on crypto strength. This policy file

// is worldwide importable.

grant {

permission javax.crypto.CryptoPermission "DES", 64;

permission javax.crypto.CryptoPermission "DESede", *;

permission javax.crypto.CryptoPermission "RC2", 128,

"javax.crypto.spec.RC2ParameterSpec", 128;

permission javax.crypto.CryptoPermission "RC4", 128;

permission javax.crypto.CryptoPermission "RC5", 128,

"javax.crypto.spec.RC5ParameterSpec", *, 12, *;

permission javax.crypto.CryptoPermission "RSA", *;

permission javax.crypto.CryptoPermission *, 128;

};

如果您不需要全球有效的设置,则只需编辑此文件并将内容更改为

// Country-specific policy file for countries with no limits on crypto strength.

grant {

// There is no restriction to any algorithms.

permission javax.crypto.CryptoAllPermission;

};

如果从Oracle下载JCE,这将得到什么。

#4楼

在Java中,默认情况下AES支持128位密钥,如果您计划使用192位或256位密钥,则Java编译器将抛出非法的密钥大小异常,您将得到该异常。

该解决方案是根据victor&James的建议,您需要根据您的JRE版本(java6,java7或java8)下载JCE(Java密码学扩展)。

JCE压缩文件包含以下JAR:

local_policy.jar

US_export_policy.jar

您需要从/jre/lib/security替换这些jar。 如果您使用的是Unix系统,则可能会参考/home/urs/usr/lib/jvm/java--oracle/

有时仅替换安全文件夹中的local_policy.jar和US_export_policy.jar在Unix上不起作用,所以我建议首先将安全文件夹复制到您的桌面,替换jar的@ Desktop / security文件夹,从/ jre / lib中删除安全文件夹/&将桌面安全文件夹移动到/ jre / lib /。

例如:: sudo mv security /usr/lib/jvm/java-7-oracle/jre/lib

#5楼

默认情况下,Java仅支持AES 128位(16字节)密钥大小进行加密。 如果您不需要的只是默认支持,则可以在使用Cipher之前将密钥修整为适当的大小。 有关默认支持的键,请参见javadoc 。

这是生成无需修改策略文件即可在任何JVM版本上使用的密钥的示例。 自行决定使用。

这是一篇关于AgileBits博客上密钥128到256密钥大小是否重要的​​好文章

SecretKeySpec getKey() {

final pass = "47e7717f0f37ee72cb226278279aebef".getBytes("UTF-8");

final sha = MessageDigest.getInstance("SHA-256");

def key = sha.digest(pass);

// use only first 128 bit (16 bytes). By default Java only supports AES 128 bit key sizes for encryption.

// Updated jvm policies are required for 256 bit.

key = Arrays.copyOf(key, 16);

return new SecretKeySpec(key, AES);

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值