我有一个带有private static final
字段的类,不幸的是,我需要在运行时更改.
使用反射我得到这个错误: java.lang.IllegalAccessException: Can not set static final boolean field
有没有办法改变价值?
Field hack = WarpTransform2D.class.getDeclaredField("USE_HACK");
hack.setAccessible(true);
hack.set(null, true);
Run Code Online (Sandbox Code Playgroud) 我之前曾问过一个关于这个问题的问题,但它没有得到正确的答案而且无处可去.
所以我已经澄清了关于这个问题的一些细节,我真的很想听听你如何解决这个问题或者我应该尝试什么的想法.
我在我的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);
}
Run Code Online (Sandbox Code Playgroud)
今天我在我的服务器用户上安装了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
Run Code Online (Sandbox Code Playgroud)
第25行是:
c.init(Cipher.DECRYPT_MODE, secretKeySpec);
注意:
*服务器的1.6.0.12 …
我为MacOSX安装了Oracle JRE 7(不是JDK),但我无法找到放置JCE管辖区文件的位置.
我需要用无限强度版本替换它们.
我想尝试JDK 9,我需要修补JCE.我在哪里可以得到JCE zip file for JDK 9
?或者我可以使用JDK 8吗?我为JDK 9搜索了JCE zip,但无法找到它.提前致谢.
在java平台文档http://www.oracle.com/technetwork/java/javase/jrereadme-182762.html中.关于评论
/lib/security/local_policy.jar /lib/security/US_export_policy.jar
由于某些国家/地区的导入控制限制,Java SE Development Kit和Java SE Runtime Environment附带的Java Cryptography Extension(JCE)策略文件允许使用强大但有限的加密.
JDK网站上提供了这些文件的无限强度版本,表明对加密强度没有限制,适用于符合条件的国家/地区的用户.那些居住在符合条件的国家/地区的人可以下载无限强度版本,并使用无限强度文件替换强加密jar文件.问题
我正在对kerberos认证的REST服务执行https请求.如果我使用keytab,一切都很好.但是,我要求我应该使用kerberos票证缓存文件,该文件是在使用其密码登录工作站时创建的.
我将用MY_DOMAINE.COM替换域名
所以,klist显示:
Ticket cache: FILE:/tmp/krb5cc_210007
Default principal: dragomira@MY_DOMAINE.COM
Valid starting Expires Service principal
05/15/18 07:21:51 05/15/18 17:21:51 krbtgt/MY_DOMAINE.COM@MY_DOMAINE.COM
renew until 05/22/18 06:18:22
Run Code Online (Sandbox Code Playgroud)
像这样使用卷曲可以正常工作:
curl -k --negotiate -u : 'my_url' -v
Run Code Online (Sandbox Code Playgroud)
现在,让我们回到代码.我的login.conf是这样的:
com.sun.security.jgss.login {
com.sun.security.auth.module.Krb5LoginModule required
client=TRUE
doNotPrompt=true
useTicketCache=true;
};
com.sun.security.jgss.initiate {
com.sun.security.auth.module.Krb5LoginModule required
client=TRUE
doNotPrompt=true
useTicketCache=true;
};
com.sun.security.jgss.accept {
com.sun.security.auth.module.Krb5LoginModule required
client=TRUE
doNotPrompt=true
useTicketCache=true;
};
Run Code Online (Sandbox Code Playgroud)
我的http客户端的相关java代码是针对kerberos的,它是:
try {
SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, (chain, authType) -> true).build();
HostnameVerifier hostnameVerifier = new NoopHostnameVerifier();
Registry<AuthSchemeProvider> authSchemeRegistry = RegistryBuilder.<AuthSchemeProvider>create()
.register(AuthSchemes.SPNEGO, new SPNegoSchemeFactory()) …
Run Code Online (Sandbox Code Playgroud) java kerberos apache-httpcomponents apache-httpclient-4.x apache-httpclient-5.x
我正在尝试将java-1.8.0-openjdk jre和jdk打包,但我找不到openjdk 8的jce策略
在哪里可以找到它?谁能指出我的链接。
我在商业Web应用程序中需要AES256加密/解密.目前一切都很好,密钥大小为128.这在加密方面并不令人满意,所以我的问题是如何最好地绕过这个问题而不需要用户手动安装任何东西.
我有来自Oracle的无限制管辖jar文件,但我不知道在用户的JRE/lib/security目录中替换这些文件是否与旧版本兼容.显然我不想破坏用户的JRE.此外,我对我的JRE安全目录有写权限,但我认为某些用户不具备这些权限.
有没有一个简单的方法来解决这个问题,或者我是坚持使用弱加密还是可能有问题的用户步骤?
更新"unrestricting" javax.crypto.JceSecurity
@ntoskml你是对的.getMaxAllowedKeyLength仍然返回有限的密钥大小,但加密成功,密钥大小== 256 :).如果有强加密功能,我会更新我的测试方法并设置密钥大小.谢谢
>>> from javax.crypto import Cipher
>>> Cipher.getMaxAllowedKeyLength("AES")
128
>>> from java.lang import Class
>>> c = Class.forName("javax.crypto.JceSecurity")
>>> isRestricted = c.getDeclaredField("isRestricted")
>>> isRestricted.setAccessible(True)
>>> isRestricted.set(None, False)
>>> isRestricted.get(None)
False
>>> Cipher.getMaxAllowedKeyLength("AES")
128
>>> from javax.crypto import KeyGenerator
>>> kge = KeyGenerator.getInstance("AES")
>>> kge.init(256)
>>> aesKey = kgen.generateKey()
>>> c2 = Cipher.getInstance("AES")
>>> c2.init(Cipher.ENCRYPT_MODE, aesKey)
>>> c2.doFinal("test")
array('b', [-81, 99, -61, -51, 93, -42, -68, -28, 107, 59, -109, -98, -25, …
Run Code Online (Sandbox Code Playgroud) java ×10
jce ×5
encryption ×2
applet ×1
cryptography ×1
final ×1
java-8 ×1
java-9 ×1
kerberos ×1
linux ×1
macos ×1
private ×1
reflection ×1
security ×1
static ×1