从javareflection中隐藏我的安全密钥
以下类是我的加密安全密钥提供程序。
public class MySecretKey { private String key="2sfdsdf7787fgrtdfg#$%@cj5"; ... //Some Util methods goes on Here . }
首先,我不相信没有吸气剂就可以访问private
数据,但是,我的天哪,我现在能够在控制台中看到密钥。
在其他地方使用reflection,我们可以看到如下代码:
public static void main(String[] args) throws Exception { Stacker myClass = new Stacker(); Field key= myClass.getClass().getDeclaredField("key"); field1.setAccessible(true); System.out.println(key.get(myClass)); }
如何从我的课外隐藏我的密钥:(甚至private
关键字也无法帮助我反思。
请给我一些提示。
提前致谢。
setAccessible
说
首先,如果有安全管理器,则使用
ReflectPermission("suppressAccessChecks")
权限调用其checkPermission方法。
所以你可以通过拒绝suppressAccessChecks权限来防止这种情况。
实际上,最好避免依赖JVM来保护对象的不可侵犯性。 Joe-E允许JVM中的类之间存在相互怀疑,但JVM并不是为此而设计的。
通过在hex编辑器中打开类文件,可以很容易地检查Java类中定义的所有字符串,它们无论如何都不会被隐藏。 更不用说它们可以使用reflection以编程方式检索,正如您刚刚发现的那样。
您用于“隐藏”私钥的机制已被破坏,并且完全存在缺陷。 您应该将密钥存储在外部文件中,例如,通过其他方式保护的序列化加密密钥存储区 – 例如,密码或存储在其他位置的其他密钥。
首选解决方案是将密钥存储在文件中,然后使用文件系统权限来限制对文件的访问。 它不是一个完美的解决方案(当然不是那么方便),但它比在代码中硬连线键更好。
容易,使这个类non-instantiatable
如何?
创建一个私有构造函数并使您的key
段保持static
所以你的课程看起来像这样
public class MySecretKey { public static String key="2sfdsdf7787fgrtdfg#$%@cj5"; private MySecretKey(){} //Private constructor //No Util methods will go here. }
- 如何在进入主程序之前提示用户输入密码?
- 无效的END标头(错误的中央目录大小)zipException
- javax.sound.sampled.UnsupportedAudioFileException:加载wav文件时无法从输入文件中获取音频输入流
- 从证书DN中解析CN
- 在java中的64位机器上运行32位dll
- 如何将元素的内部文本内容映射到Class属性?
- Jersey2,Hk2dependency injection(自动)给出AbstractMethodError:org.jvnet.hk2.internal.DynamicConfigurationImpl.addIdempotentFilter
- MongoDB,Java:以UTC格式检索日期属性
- 用于Java中不同枚举类的联合的switch语句