在哪里存储密钥库密码?
Where to store keysytore password?
我看到的每个例子都说要使用强密码,但他们只是在源代码中加上它。这对我来说似乎不太正确。
是否可以将密钥库作为当前帐户进行身份验证,从而不涉及密码?
如果那不可能,我要求不要在源代码中存储密码,这是完全可以接受的,但似乎在某些时候密码需要成为等式的一部分,有人可以指点我吗最安全的处理方式?
我很想在构建过程中添加密码,但我在构建服务器上有一个明文密码,这对我来说几乎是一样的。
首先,一般规则:如果您发布的软件本身能够解锁某些 'secure store'(因此,无需您控制的服务器或您控制的其他硬件) ... 无法向运行它的计算机的所有者隐藏此信息。
示例:Web 浏览器往往具有提供存储网站密码的功能。这些密码存储在文件中,使用正确的工具,您可以打开这些文件并一目了然地查看密码。没有办法用更多的软件或更多的加密算法来解决这个问题。唯一的解决方案是让软件无法解锁所述数据存储,例如要求用户每次想查看时都输入主密码,或者将某种安全飞地放入硬件并让其负责加密货币。 Java 通常没有合适的库来与此类硬件交互(苹果的 T2 是对这一概念的非常先进的体现;TPM 芯片是一种预算选择)。
所以,一旦您同意了,您仍然可以:好的,好吧,我不想要源代码中的身份验证密钥;为了从源构建可分发的产品,构建器必须提供它。为此:
(假设maven风格的项目结构):
- 创建文件
src/main/resources/com/yourcompany/yourproject/keys/KeyFile.txt
,然后更新 .gitignore
文件以忽略它,方法是将 /src/main/resources/com/yourcompany/yourproject/keys/KeyFile.txt
放在那里。
- 在此文件中写入密钥。通过一些安全的方式与项目中应该拥有它的所有成员共享此文件。
编写代码:在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' 包含任何空格,则必须更新扫描器的定界符(我在这里使用扫描器作为将输入流转换为完整字符串的最快方法;如果您有例如番石榴,它有更好的调用来做到这一点,你应该使用它们)。
我看到的每个例子都说要使用强密码,但他们只是在源代码中加上它。这对我来说似乎不太正确。
是否可以将密钥库作为当前帐户进行身份验证,从而不涉及密码?
如果那不可能,我要求不要在源代码中存储密码,这是完全可以接受的,但似乎在某些时候密码需要成为等式的一部分,有人可以指点我吗最安全的处理方式?
我很想在构建过程中添加密码,但我在构建服务器上有一个明文密码,这对我来说几乎是一样的。
首先,一般规则:如果您发布的软件本身能够解锁某些 'secure store'(因此,无需您控制的服务器或您控制的其他硬件) ... 无法向运行它的计算机的所有者隐藏此信息。
示例:Web 浏览器往往具有提供存储网站密码的功能。这些密码存储在文件中,使用正确的工具,您可以打开这些文件并一目了然地查看密码。没有办法用更多的软件或更多的加密算法来解决这个问题。唯一的解决方案是让软件无法解锁所述数据存储,例如要求用户每次想查看时都输入主密码,或者将某种安全飞地放入硬件并让其负责加密货币。 Java 通常没有合适的库来与此类硬件交互(苹果的 T2 是对这一概念的非常先进的体现;TPM 芯片是一种预算选择)。
所以,一旦您同意了,您仍然可以:好的,好吧,我不想要源代码中的身份验证密钥;为了从源构建可分发的产品,构建器必须提供它。为此:
(假设maven风格的项目结构):
- 创建文件
src/main/resources/com/yourcompany/yourproject/keys/KeyFile.txt
,然后更新.gitignore
文件以忽略它,方法是将/src/main/resources/com/yourcompany/yourproject/keys/KeyFile.txt
放在那里。 - 在此文件中写入密钥。通过一些安全的方式与项目中应该拥有它的所有成员共享此文件。
编写代码:在
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' 包含任何空格,则必须更新扫描器的定界符(我在这里使用扫描器作为将输入流转换为完整字符串的最快方法;如果您有例如番石榴,它有更好的调用来做到这一点,你应该使用它们)。