通过环境变量或JVM参数提供密钥?

时间:2015-08-06 19:01:42

标签: java linux windows environment-variables jvm-arguments

我有一个托管在云上的JVM应用程序,需要一个密钥才能完成。 我已经考虑了各种方法来为应用程序提供此密钥。该应用程序可以在Windows或Linux上运行。

  1. 将密钥设置为OS环境变量(set someInnocuousName=secretkey);使用System.getenv
  2. 读取密钥
  3. 将密钥设置为JVM参数(-DsomeInnocuousName=secretkey),使用System.getProperty读取密钥并使用System.setProperty重置属性。)
  4. 在源代码中设置部分密钥。
  5. 我可以做3 AND 1或2。 在服务器泄露的情况下,1或2中哪一个更安全? 我倾向于2.一旦我使用JVM参数提供密钥,我能够“覆盖它的轨道”吗?

    1和2的优点和缺点是什么?

    欢迎任何其他存储密钥的建议。

2 个答案:

答案 0 :(得分:0)

我遇到了同样的问题并使用了选项2:

    String sharedKey = System.getProperty("aeriosKey");
    if (Strings.isNullOrEmpty(sharedKey)) {
        LoggerFactory.getLogger(Ingestor.class).error("System property aeriosKey must be set");
        return;
    }

    String s3env = System.getProperty(S3ENV, DEFAULT_S3_ENV);
    String s3accessKey = System.getProperty(S3ACCESS_KEY);
    String s3secretKey = System.getProperty(S3SECRET_KEY);
    if (!ALLOWED_S3_ENVS.contains(s3env)) {
        error("System property s3env must be unset or one of [" + String.join(",", ALLOWED_S3_ENVS) + "]");
        return;
    }
    if (Strings.isNullOrEmpty(s3accessKey) || Strings.isNullOrEmpty(s3secretKey)) {
        error("System properties s3accessKey and s3secretKey must be set");
        return;
    }

这样做的好处是您可以通过更改.properties文件轻松切换密钥,并且只有在需要时才能使该文件对正在运行该特定进程的用户可读。环境变量更加分离,并且可以被特定环境中的任何进程读取。

答案 1 :(得分:0)

在Windows和Linux中,在命令行上键入“ history”,您将明白为什么在命令行中添加秘密内容是一个坏主意。如果这样还不吓您“ Google”存储在“我的命令历史记录存储在哪里”和“黑客如何访问我的命令历史记录”呢?

首选方法是使用“特权访问管理器”应用程序,例如Cyber​​Ark或Thycotic或Centrify。另一种选择是公用密钥和专用密钥以及SSH。这样可以进行无密码身份验证,并且被认为是安全的。

最坏的情况是,使用具有SALT和安全加密算法的密钥。 。 。并确保密钥是安全的(顺便说一句,在当今世界,“安全”是很难的)。

那里有很多渗透测试公司。您可以尝试致电给他们。如果他们过得愉快,您可能会得到免费建议。