如何使用Java在Mac Keychain中存储用户名/密码?

11

我想使用Mac KeyChain来存储一些用户名和密码组合,供我的Java Swing应用程序代表用户连接外部服务时使用。

我已经找到了一些来源,演示了可以通过以下方式访问java.security.KeyStore对象:

KeyStore keyStore = KeyStore.getInstance("KeychainStore", "Apple");
keyStore.load(null, null);

然而,我找不到如何使用生成的KeyStore来实际存储/检索用户名和密码的示例。

任何帮助都将不胜感激。

谢谢!


此问题在此讨论:https://dev59.com/UnRB5IYBdhLWcg3wET5J。请查看用户erickson的回答。 - dejuknow
如果我选择这条路,我将不得不随应用程序分发私钥。这对我来说似乎并不是最好的解决方案。难道没有一种像普通的Mac应用程序那样将密码存储在钥匙串中的方法吗? - John Watson
看起来你正在尝试使用java.security.KeyStore来访问Apple Keychain Services。KeyStore是许多提供程序的抽象包装器。这种方法限制了使用实现特定功能的能力。这里有一个更具体的包装器:https://github.com/conormcd/osx-keychain-java此外,这是使用该服务的示例,请参见(图1-3)https://developer.apple.com/library/ios/documentation/Security/Conceptual/keychainServConcepts/03tasks/tasks.html - Frobbit
3个回答

1
你无法从“Java KeyStore”中获取“Apple Keychain密码”。
密钥库抽象仅包装了密钥链中的证书。
请查看密钥链的本机视图(bash cmd)与Java的视图(bash cmd)之间的差异: security dump ~/Library/Keychains/login.keychain keytool -list -storetype KeychainStore -keystore ~/Library/Keychains/login.keychain 请注意,只包括证书并且列表较短。
您需要使用可以访问其所有功能的不同封装器来使用Keychain。
建议:
github.com/conormcd/osx-keychain-java
使用swig制作JNI封装器

同时阅读原生文档:钥匙串服务概念 -- OS X钥匙串服务任务(见图1-3)


您可以检查包装器以查看是否错过了可能的路径:http://cr.openjdk.java.net/~michaelm/7113349/7u4/4/jdk7u-osx/new/src/macosx/classes/apple/security/KeychainStore.java.html - Frobbit

1
你可以使用命令行工具"security"来存储和检索钥匙串中的密码。它可能会弹出一个窗口,要求您允许访问。显然,这只适用于OSX操作系统。
以下是保存密码的示例:
security add-generic-password -s mywonderfulapp -a $username -w $password

要检索密码,您可以执行以下操作:
security -i find-generic-password -l mywonderfulapp -w

为了更方便地捕获输出,您可以使用JProc库,例如:
String password = ProcBuilder.run(
    "security", 
    "-i", "find-generic-password", 
    "-l", "mywonderfulapp", "-w"
);

这可以帮助我将凭据存储在您提到的钥匙串和库中。 - Arefe

0

很不幸,它并没有提供任何帮助。它似乎只是关于存储密钥和证书的,但我真正需要的是存储用户名/密码组合。 - John Watson
我认为这是针对Java Keystore而不是macOS Keychain的。我认为它不适用。 - Jason

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接