Mac OS X Keychain 访问 Java 通用密码

Mac OS X Keychain access in Java for Generic Passwords

仅使用 Java 在 OS X 的钥匙串中检索通用密码的标准方法是什么? Apple Developer Pages 提供了一些很好的背景,但不幸的是,实现和示例是用 C 或本机代码编写的。

Java KeyStore OS X 实现似乎仅适用于 public/private 密钥对和证书,但不适用于通用 username/password 组合。

我看到一个项目启动了Here:但是它比较老,没有积极维护。

是否有更先进的解决方案来解决 Mac OS X Java 中的凭据安全问题?

编辑:OAuth 不是 class 我在其中操作的问题和环境的选项......

这似乎是一个相当普遍的问题;我发现的唯一解决方案看起来可能满足您的要求是 this Github project,但它似乎非常 old/unmaintained,而且我不能说代码的质量或安全性。

不幸的是,似乎没有本地支持访问存储在钥匙串中的密码,而且这似乎不是一个足够普遍的问题,以至于没有一个积极的-开发库来解决它。

我自己使用命令行完成了此操作,例如运行宁/usr/bin/security。但是它没有强大的访问控制。因此,您可以从终端 运行 /usr/bin/security 访问相同的密码,但直接调用库的 C++ 应用程序将被阻止。

因此,我仅将其用于社交媒体帐户的 oauth 令牌。您可以通过在以用户身份登录时启动 Web 浏览器来执行类似的操作。

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

根据 f-stephen-q 的上述回答,这个库似乎仍然运行良好。我正在使用它的一个分支,它是 mavenised

$ 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");
 ==> "b"

这里还有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);

我现在正在使用 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