3

下面的类是我用于加密的安全密钥提供程序。

public class MySecretKey {
private String key="2sfdsdf7787fgrtdfg#$%@cj5";
...
//Some Util methods goes on  Here .
}

首先,我不相信 private 没有 getter 就可以访问数据,但是,天哪,我现在可以在控制台中看到密钥了。

在其他使用反射的地方,我们可以看到如下代码:

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关键字也不能帮助我在反射的情况下。

请给我一些提示。

提前致谢。

4

4 回答 4

1

首选的解决方案是将密钥存储在文件中,然后使用文件系统权限来限制对文件的访问。这不是一个完美的解决方案(当然不是那么方便),但它比在代码中硬连线更好。

于 2013-02-15T21:22:13.030 回答
1

通过在十六进制编辑器中打开类文件,可以轻松检查 Java 类中定义的所有字符串,它们无论如何都不是隐藏的。更不用说可以使用反射以编程方式检索它们,正如您刚刚发现的那样。

您用于“隐藏”私钥的机制已损坏,并且完全有缺陷。相反,您应该将密钥存储在外部文件中,例如序列化、加密的密钥存储,并通过其他方式保护 - 例如,密码或存储在其他地方的另一个密钥。

于 2013-02-15T21:26:25.463 回答
1

setAccessible

首先,如果有一个安全管理器,它的 checkPermission 方法会以一个ReflectPermission("suppressAccessChecks")权限被调用。

因此您可以通过拒绝suppressAccessChecks权限来防止这种情况。

但实际上,最好避免依赖 JVM 来保持对象不可侵犯性。 Joe-E允许 JVM 中的类之间相互怀疑,但 JVM 并不是为此而设计的。

于 2013-02-15T21:27:30.330 回答
1

简单,做这门课non-instantiatable 怎么做?

创建一个私有构造函数并创建你的key字段static

所以你的课看起来像这样

public class MySecretKey {
    public static String key="2sfdsdf7787fgrtdfg#$%@cj5";
    private MySecretKey(){} //Private constructor
    //No Util methods will go here.
}
于 2018-06-28T09:18:42.677 回答