从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. }