在哪里存储密钥库密码?

Where to store keysytore password?

我看到的每个例子都说要使用强密码,但他们只是在源代码中加上它。这对我来说似乎不太正确。

是否可以将密钥库作为当前帐户进行身份验证,从而不涉及密码?

如果那不可能,我要求不要在源代码中存储密码,这是完全可以接受的,但似乎在某些时候密码需要成为等式的一部分,有人可以指点我吗最安全的处理方式?

我很想在构建过程中添加密码,但我在构建服务器上有一个明文密码,这对我来说几乎是一样的。

首先,一般规则:如果您发布的软件本身能够解锁某些 'secure store'(因此,无需您控制的服务器或您控制的其他硬件) ... 无法向运行它的计算机的所有者隐藏此信息

示例:Web 浏览器往往具有提供存储网站密码的功能。这些密码存储在文件中,使用正确的工具,您可以打开这些文件并一目了然地查看密码。没有办法用更多的软件或更多的加密算法来解决这个问题。唯一的解决方案是让软件无法解锁所述数据存储,例如要求用户每次想查看时都输入主密码,或者将某种安全飞地放入硬件并让其负责加密货币。 Java 通常没有合适的库来与此类硬件交互(苹果的 T2 是对这一概念的非常先进的体现;TPM 芯片是一种预算选择)。

所以,一旦您同意了,您仍然可以:好的,好吧,我不想要源代码中的身份验证密钥;为了从源构建可分发的产品,构建器必须提供它。为此:

(假设maven风格的项目结构):

  1. 创建文件 src/main/resources/com/yourcompany/yourproject/keys/KeyFile.txt,然后更新 .gitignore 文件以忽略它,方法是将 /src/main/resources/com/yourcompany/yourproject/keys/KeyFile.txt 放在那里。
  2. 在此文件中写入密钥。通过一些安全的方式与项目中应该拥有它的所有成员共享此文件。
  3. 编写代码:在src/main/java/com/yourcompany/yourproject/keys/ProjectKey.java中有一个静态方法来检索密钥。它看起来像这样:

    public final class ProjectKey {
        /* prevent instantiation */ private ProjectKey(){}
    
        private static final String PROJECT_KEY = loadKey();
    
        public static String getKey () {
            if (PROJECT_KEY != null) return PROJECT_KEY;
            throw new IllegalStateException(
                "Key file not present; find somebody with the file and place in: " +
                "src/main/resources/java/com/yourcompany/yourproject/keys/KeyFile.txt");
        }
    
        private static String loadKey() {
            InputStream in = ProjectKey.class.getResourceAsStream("KeyFile.txt");
            try {
                return in == null ? null : new Scanner(in, "UTF-8").next();
            } finally {
                if (in != null) in.close();
            }
        }
    }
    

在您的项目中创建一个名为 'keys' 或诸如此类的目录。在根目录下的 .gitignore 文件中,放置行 /keys 以确保这些不会进入源代码管理。

如果您希望构建在文件丢失时失败,则您必须使用一些构建工具插件。此外,如果 'key' 包含任何空格,则必须更新扫描器的定界符(我在这里使用扫描器作为将输入流转换为完整字符串的最快方法;如果您有例如番石榴,它有更好的调用来做到这一点,你应该使用它们)。