我看到的每个例子都说使用强密码但是他们只是在源代码中使用它。这对我来说似乎不太合适。
是否可以作为当前帐户向密钥库进行身份验证,因此不涉及密码?
如果那是不可能的,我要求不在源代码中存储密码,这是完全可以接受的,但似乎在某些时候密码需要成为等式的一部分,有人可以指出我最安全的方式处理这个(事情?
我很想添加密码作为构建的一部分,但后来我在构建服务器上有一个明文密码,这几乎与我大致相同。
首先,一般规则:如果您运送的软件本身都可以解锁一些“安全存储”(因此,不受您控制的服务器或您控制下的其他硬件的干扰)......这是不可能的从运行它的计算机的所有者隐藏此信息。
示例: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'包含任何空格,你必须更新扫描仪的分隔符(我在这里使用扫描仪作为将输入流转换成完整字符串的最快方法;如果你有例如Guava,它有更好的调用要做到这一点,你应该使用那些)。