Java中访问Mac OS X钥匙串以获取通用密码

7
仅使用Java在OS X中检索Keychain中的通用密码的标准方法是什么?Apple Developer Pages提供了一些很好的背景知识,但是实现和示例都是不幸的C或本地代码。
Java KeyStore OS X实现似乎仅适用于公钥/私钥对和证书,而不是通用的用户名/密码组合。
我看到有一个项目Here:但它相对较旧且没有得到积极维护。
在Java中保护Mac OS X中的凭据的问题是否有更先进的解决方案?
编辑:OAuth对于我正在操作的问题和环境不是一个选择...
5个回答

3

根据f-stephen-q的回答,这个库似乎仍然运行良好。我正在使用其maven版本的分支。

$ git clone https://github.com/physion/osx-keychain-java
$ mvn install
$ cp dist/osxkeychain.jar ~/myproject/external

添加依赖

<dependency>
  <groupId>us.physion</groupId>
  <artifactId>osx-keychain</artifactId>
  <version>1.0</version>
  <scope>system</scope>
  <systemPath>${project.basedir}/external/osxkeychain.jar</systemPath>
</dependency>

运行它

osx-keychain-java$ jshell -cp ./dist/osxkeychain.jar

jshell> import com.mcdermottroe.apple.*;
jshell> OSXKeychain keychain = OSXKeychain.getInstance();
keychain ==> com.mcdermottroe.apple.OSXKeychain@2286778

jshell> keychain.addGenericPassword("aardvark", "a", "b");

jshell> keychain.findGenericPassword("aardvark", "a");
$4 ==> "b"

谢谢,我接受这个答案,因为它提供了最详细的信息! - echen

2

我曾经通过使用命令行(例如运行 /usr/bin/security)来完成这个操作。但是它没有很强的访问控制,所以你可以从终端运行 /usr/bin/security 来访问相同的密码,但是一个直接调用这个库的 C++ 应用程序将会被阻止。

因此,我只在社交媒体账户的oauth tokens中使用它。类似的事情可以通过以用户身份登录后启动 web 浏览器来完成。

https://github.com/yschimke/oksocial/blob/master/src/main/java/com/baulsupp/oksocial/credentials/OSXCredentialsStore.java


2
我现在正在使用https://github.com/davidafsilva/jkeychain,它是conormcd/osx-keychain-java的分支。
Gradle
compile 'pt.davidafsilva.apple:jkeychain:1.0.0'

例子
final OSXKeychain keychain = OSXKeychain.getInstance();
final Optional<String> mySecret = keychain.findGenericPassword("mySecret", "username");

示例项目用法:https://github.com/yschimke/okurl/blob/b3208514b4338a2f57bfedccb2da4e6f54d0d99a/src/main/kotlin/com/baulsupp/okurl/credentials/OSXCredentialsStore.kt (其中链接指向 GitHub 上的项目源代码)

1
这似乎是一个相当常见的问题;我找到的唯一看起来可能符合您要求的解决方案是this Github project,但它似乎非常古老/未维护,我无法保证代码的质量或安全性。
不幸的是,似乎没有原生支持访问钥匙串中存储的密码,并且这似乎不足以成为一个被积极开发的库来解决。

1
这里还有一个 JNA + Maven 项目,不需要在构建过程中编译任何本地代码。显然支持 OSX 和 Windows。

https://bitbucket.org/east301/java-keyring/

它的功能比osx-keychain-java少,但支持添加和获取通用密码。
<dependency>
  <groupId>net.east301</groupId>
  <artifactId>java-keyring</artifactId>
  <version>1.0.0</version>
</dependency>

示例代码
import net.east301.keyring.Keyring;
import net.east301.keyring.PasswordRetrievalException;

Keyring keyring = Keyring.create();
String pw = keyring.getPassword(service, account);

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