【问题标题】:Where to store keysytore password?在哪里存储密钥库密码?
【发布时间】:2019-03-10 02:23:20
【问题描述】:

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

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

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

我很想将密码添加为构建的一部分,但后来我在构建服务器上有一个明文密码,这对我来说几乎是一样的。

【问题讨论】:

    标签: java security passwords keystore


    【解决方案1】:

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

    示例:网络浏览器往往具有提供存储网站密码的功能。这些密码存储在文件中,使用正确的工具,您可以打开这些文件并查看密码。没有办法用更多的软件或更多的加密算法来解决这个问题。唯一的解决方案是使软件无法解锁所述数据存储,例如要求用户在每次想要查看时输入主密码,或者在硬件中放置某种安全飞地并让其负责加密货币。 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 以确保这些不会进入源代码管理。

    如果您希望在文件丢失时构建失败,您将不得不使用一些构建工具插件。此外,如果“键”包含任何空格,您必须更新扫描仪的分隔符(我在这里使用扫描仪作为将输入流转换为完整字符串的最快方法;如果您有例如 Guava,它有更好的调用这样做,你应该使用那些)。

    【讨论】:

    • 谢谢,这就是我正在做的事情——我只是希望有一种方法可以分配应用程序对服务器资源的访问权限,而无需从应用程序本身进行身份验证。
    猜你喜欢
    • 2011-04-30
    • 1970-01-01
    • 1970-01-01
    • 2012-09-06
    • 2013-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多