在哪里存储Keyytore密码?

时间:2018-10-04 15:58:55

标签: java security passwords keystore

我看到的每个示例都说使用强密码,但是随后他们只是将其拍入了源代码中。在我看来,这似乎不太正确。

是否可以通过当前帐户向密钥库进行身份验证,因此不涉及密码?

如果不可能的话,我有一个要求不要将密码存储在源代码中,这是完全可以接受的,但是似乎在某些时候密码需要成为方程式的一部分,有人可以指出我的最大意思吗?解决这个问题的安全方法?

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

1 个答案:

答案 0 :(得分:1)

首先,一般规则是:如果您发行的软件本身能够解锁某些“安全存储”(因此,无需涉及您控制下的服务器或您控制下的其他硬件)... 无法向运行它的计算机的所有者隐藏此信息

示例:Web浏览器倾向于具有提供存储网站密码的功能。这些密码存储在文件中,并且使用正确的工具,您可以打开这些文件,并以普通密码查看密码。无法通过更多软件或更多加密算法来解决此问题。唯一的解决方案是使软件无法解锁所述数据存储,例如,要求用户每次想要输入时都输入主密码,或者将某种安全的区域放入硬件中并由其负责加密货币。 Java通常没有合适的库来与此类硬件进行交互(Apple的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,以确保这些内容不进入源代码管理。

如果您要在文件丢失的情况下使构建失败,则必须弄乱一些构建工具插件。另外,如果“键”包含任何空格,则必须更新扫描仪的定界符(我在这里使用扫描仪是将输入流转换为完整字符串的最快方法;例如,如果使用番石榴,则调用效果更好为此,您应该使用这些。)