我看到的每个示例都说要使用强密码,但是他们只是在源代码中添加了密码。在我看来,这似乎不太正确。
是否可以作为当前帐户向密钥库进行身份验证,因此不涉及密码?
如果不可能,我有一个要求,就是不要将密码存储在源代码中,这是完全可以接受的,但是似乎在某些时候密码需要成为方程式的一部分,有人可以指出我最安全的方式来进行加密吗?处理这个(事情?
我很想在构建过程中添加密码,但是然后我在构建服务器上有了一个明文密码,这对我来说几乎是相同的。
首先,一般规则是:如果您发布的软件本身能够解锁某些“安全存储”(因此,无需涉及您控制下的服务器或您控制下的其他硬件)… 是不可能的向运行它的计算机的所有者隐藏此信息 。
示例:Web浏览器往往具有提供存储网站密码的功能。这些密码存储在文件中,并且使用正确的工具,您可以打开这些文件,并将密码简单地视为一天。无法通过更多软件或更多加密算法来解决此问题。唯一的解决方案是使软件无法解锁该数据存储,例如,要求用户每次想要输入时都输入主密码,或者在硬件中放入某种安全的区域并由其负责加密 Java通常没有合适的库来与此类硬件进行交互(Apple的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以确保这些内容不会进入源代码管理。
/keys
You’d have to mess around with some build tool plugins if you want builds to fail if the file is missing. Also, you’d have to update the scanner’s delimiter if the ‘key’ contains any whitespace (I’m using scanner here as the fastest way to turn an inputstream into a complete string; if you have for example Guava, it has better calls to do that, and you should use those).