如何将程序密码存储在 OS 密钥库中?

How can I store a program password in the OS keystore?

我目前正在 Mac 上开发 Java 应用程序。我知道有来自 Apple 的密钥库,我想在该密钥库中安全地存储密码。

根据 Apple 开发人员的说法,我可以使用 keyStore = KeyStore.getInstance("KeychainStore", "Apple");

获取密钥库

现在我的问题是:如何存储密码以及如何重新找回密码? 我已经阅读了很多关于密钥库的内容,但我不知道具体实现会是什么样子。

以及如何从 Windows / Linux 获取内置密钥库?

我认为你做不到。密钥库存在的原因与您正在寻找的 public 密钥基础设施不同(我认为有人提到了这一点)。您不能将密码存储在密钥库中。你说你在 Windows 上这样做,对吧?我不认为 Windows 允许像您正在寻找的东西。使用不同的设备,或尝试使用不同类型的代码。

java.security.KeyStore 不是 为处理密码而创建的。它是加密密钥和证书的存储设施。虽然您可以尝试使用它来存储密码,因为它可以存储私钥,但我建议您不要这样做,因为 KeyStore 的 API 很麻烦并且不是为您的用例设计的。 https://docs.oracle.com/javase/8/docs/api/java/security/KeyStore.html

如何在 Windows、Linux 或 macOS

中存储密码

您需要的是 Keychain in macOS and similar tools in other operating systems. Since you are also asking about Windows and Linux, you might be interested in the Java Keyring 库。它将密码存储在:

  1. Keychain 在 macOS 上
  2. Credential Manager 在 Windows
  3. DBus Secret Service 在 GNOME 上

使用方法如下:

public static void main(String[] args) throws Exception {
    Keyring keyring = Keyring.create();
    String serviceName = "test-app";
    String accountName = "test-account";
    keyring.setPassword(serviceName, accountName, "test-password");
    String password = keyring.getPassword(serviceName, accountName);
    System.out.println(password);
}

Gradle

implementation 'com.github.javakeyring:java-keyring:1.0.1'

行家

<dependency>
  <groupId>com.github.javakeyring</groupId>
  <artifactId>java-keyring</artifactId>
  <version>1.0.1</version>
</dependency>

如果您想支持 GNOME 以外的桌面环境,您可能需要想出自己的解决方案或搜索不同的库,但这应该可以帮助您入门。