存储密钥库密码的位置?

问题描述 投票:1回答:1

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

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

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

我很想添加密码作为构建的一部分,但后来我在构建服务器上有一个明文密码,这几乎与我大致相同。

java security passwords keystore
1个回答
1
投票

首先,一般规则:如果您运送的软件本身都可以解锁一些“安全存储”(因此,不受您控制的服务器或您控制下的其他硬件的干扰)......这是不可能的从运行它的计算机的所有者隐藏此信息。

示例: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'包含任何空格,你必须更新扫描仪的分隔符(我在这里使用扫描仪作为将输入流转换成完整字符串的最快方法;如果你有例如Guava,它有更好的调用要做到这一点,你应该使用那些)。

© www.soinside.com 2019 - 2024. All rights reserved.