Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从java反射中隐藏我的安全密钥_Java_Security_Reflection - Fatal编程技术网

从java反射中隐藏我的安全密钥

从java反射中隐藏我的安全密钥,java,security,reflection,Java,Security,Reflection,下面的类是我的加密安全密钥提供程序 public class MySecretKey { private String key="2sfdsdf7787fgrtdfg#$%@cj5"; ... //Some Util methods goes on Here . } 首先,我不相信不用getter就可以访问private数据,但是,天哪,我现在可以在控制台中看到密钥了 在其他使用反射的地方,我们可以看到如下代码: public static void main(String[] args)

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

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
关键字也不能帮助我进行反射

请给我一些提示


提前感谢。

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

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

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

首先,如果有一个安全管理器,它的checkPermission方法将使用
ReflectPermission(“suppressAccessChecks”)
权限调用

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

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

简单, 使此类
不可实例化

怎么做

创建一个私有构造函数并创建
字段
静态

所以你的课看起来是这样的

public class MySecretKey {
    public static String key="2sfdsdf7787fgrtdfg#$%@cj5";
    private MySecretKey(){} //Private constructor
    //No Util methods will go here.
}

编译后的代码中可能会有密钥的副本…是的。没有办法让编译到代码中的数据如此安全。但是,正确的解决方案之一是不要将代码与不受信任的代码一起编译。我认为加密密钥只是可以访问的私有字段的一个示例具有反射和setAccessible(真)。在一些情况下,我对库类进行了子类化,但为了正确执行,我需要访问超类的私有字段,例如HashMap,因此我使用了这种反射技巧。当然,加密密钥不应该驻留在代码中,但我认为在其他情况下,这种技巧只会破坏封装,而不是安全性。我简言之,这个问题是关于防止反射技巧,而不是保护加密密钥。+1我认为,一般来说,信息隐藏(使用私有/受保护/等成员)是一种有助于防止错误和有助于防止糟糕代码设计的技巧;而不是作为一种安全措施。也就是说,它可以阻止编写糟糕的(如愚蠢的)代码,而不是糟糕的代码(如恶意的)代码不会被执行。这是一个很好的观点,但对象不可侵犯性仍然依赖于在类加载后保护从
SecureRandom
获取的一次性机密。我不认为OP排除了该用例。这只是将问题向前推进…您将用于解密私钥持有者的密码隐藏在哪里?