【发布时间】:2013-02-15 21:06:33
【问题描述】:
下面的类是我用于加密的安全密钥提供者。
public class MySecretKey {
private String key="2sfdsdf7787fgrtdfg#$%@cj5";
...
//Some Util methods goes on Here .
}
首先我不相信没有 getter 就可以访问 private 数据,但是,我的天哪,我现在可以在控制台中看到密钥了。
在其他地方使用反射我们可以看到如下代码:
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 关键字在反射的情况下也无济于事。
请给我一些提示。
提前致谢。
【问题讨论】:
-
无论如何,您的密钥都可以在编译后的代码中使用...
-
是的。没有办法让编译到代码中的数据像那样安全。然而,正确解决方案的第一步是不要将您的代码与不受信任的代码一起编译。
-
我认为加密密钥只是可以通过反射和 setAccesible(true) 访问的私有字段的一个示例。在某些情况下,我对库类进行了子类化,但我需要访问超类的私有字段才能正确执行,例如一个HashMap,所以我使用了这个反射技巧。当然,加密密钥不应该存在于代码中,但我认为在其他情况下,这个技巧只是破坏了封装,而不是安全性。简而言之,这个问题是关于防止反射技巧,而不是保护加密密钥。 +1
-
我认为,总的来说,信息隐藏(使用私有/受保护/等成员)是一种有助于防止错误和防止糟糕的代码设计的技巧;不作为一种安全措施。 IE。它可能会阻止编写糟糕的(如愚蠢的)代码,而不是执行糟糕的(如恶意的)代码。
标签: java security reflection