防止调试器查看变量值
Prevent debuggers to see variable value
有没有一种方法可以配置我的 JPA(我使用 hibernate 作为实现)实体的属性,以便在调试时没有人可以看到它的值?
属性 是暂时的,出于安全原因,我不希望任何人在调试时看到它。我的应用程序的 jar/war 将被第三方使用。
假设您运行您的程序在 Oracle JVM 上,并允许人们通过调试器附加到该 JVM——不,您不能隐藏某些字段。
调试器将用来与 Java 进程对话的接口是 JDI 1,它提供了几乎所有的信息JVM 有你的代码。具体来说:
- 如果某人对包含您的敏感数据的对象有 ObjectReference,他们可以获得其 ReferenceType。
- 他们可以调用
ReferenceType::allFields
在 class 中列出 所有 字段,包括临时字段:
All declared and inherited fields are included, regardless of whether they are hidden or multiply inherited.
- 回到 ObjectReference,他们可以调用
ObjectReference::getValue(Field)
来获取字段的值。请注意,文档没有说明任何有关 IllegalAccessException 或类似内容的信息。
即使您可以锁定某些字段,对您也没有多大好处;调试器将能够在局部变量中看到该值(当您读取该字段时,或者当您要写入它时)。您真正想要的是锁定某些 值 ,而不是字段。这也不在 JDI 中。
1 实际上 JDWP 在幕后,但 JDI 是建立在其之上的,在这里更容易讨论。
有没有一种方法可以配置我的 JPA(我使用 hibernate 作为实现)实体的属性,以便在调试时没有人可以看到它的值?
属性 是暂时的,出于安全原因,我不希望任何人在调试时看到它。我的应用程序的 jar/war 将被第三方使用。
假设您运行您的程序在 Oracle JVM 上,并允许人们通过调试器附加到该 JVM——不,您不能隐藏某些字段。
调试器将用来与 Java 进程对话的接口是 JDI 1,它提供了几乎所有的信息JVM 有你的代码。具体来说:
- 如果某人对包含您的敏感数据的对象有 ObjectReference,他们可以获得其 ReferenceType。
- 他们可以调用
ReferenceType::allFields
在 class 中列出 所有 字段,包括临时字段:All declared and inherited fields are included, regardless of whether they are hidden or multiply inherited.
- 回到 ObjectReference,他们可以调用
ObjectReference::getValue(Field)
来获取字段的值。请注意,文档没有说明任何有关 IllegalAccessException 或类似内容的信息。
即使您可以锁定某些字段,对您也没有多大好处;调试器将能够在局部变量中看到该值(当您读取该字段时,或者当您要写入它时)。您真正想要的是锁定某些 值 ,而不是字段。这也不在 JDI 中。
1 实际上 JDWP 在幕后,但 JDI 是建立在其之上的,在这里更容易讨论。