我有一些Java代码依赖于一个系统属性super.secret.password
。当我运行我的应用程序时,我需要设置该属性。应用程序将由一个shell脚本启动,并且密码将保存在一个最小读取权限的文件中。
我真的不想写:
java -Dsuper.secret.password=letmein gov.fortknox.MyApp
因为任何人只要能够进入机器并运行
ps
或top
命令就可以看到密码是什么。
那么,有没有一种好的方法可以设置系统属性而不在命令行中公开它们呢?
我们想到的唯一通用的解决方案是编写一个小的C程序,从文件中读取系统属性,然后使用JNI调用API启动JVM。不用说,我们不愿意这样做。
如果没有一种不使用命令行设置它们的方法,是否有一种方法可以隐藏命令行不被窥探?我们正在使用Red Hat Enterprise Linux Server 5.5。
就目前而言,所涉及的应用程序实际上是 JBoss EAP 4.3.0,我们使用系统属性来填充其 XML 配置文件中的替换构造(${like.this}
)。有针对 JBoss 的解决方案 - 要么使用 SystemPropertiesService(默认情况下,通过 deploy 目录中的 properties-service.xml 文件进行配置),要么将 -P option 传递给 run.sh。然而,我更感兴趣的是更一般的情况,即这可能是任何 Java 程序。