Accesso portachiavi Mac OS X in Java per password generiche


Qual è il modo standard per recuperare password generiche nel Portachiavi di OS X usando solo Java? Apple Developer Pages fornisce un buon background ma sfortunatamente l'implementazione e gli esempi sono in codice C o nativo.

L'implementazione di Java KeyStore OS X sembra essere valida solo per coppie di chiavi pubbliche/private e certificati, ma non per combinazioni generiche di nome utente/password.

Vedo un progetto avviato Qui: ma è relativamente vecchio e non attivamente mantenuto.

Esiste una soluzione più avanzata al problema della protezione delle credenziali in Mac OS X in Java?

EDIT: OAuth non è un'opzione per la classe di problema e ambiente in cui sto operando ...

Author: echen, 2016-07-06

4 answers

Oltre alla risposta sopra di f-stephen-q, questa libreria sembra funzionare ancora bene. Sto usando un fork di esso che è mavenised

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

Aggiunta di una dipendenza

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

Esecuzione

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"
 1
Author: Yuri Schimke, 2016-07-25 06:46:08

Questo sembra essere un problema abbastanza comune; l'unica soluzione che ho trovato che sembra che possa soddisfare le tue esigenze è questo progetto Github, ma sembra essere estremamente vecchio/non mantenuto, e non posso parlare con la qualità o la sicurezza del codice.

Sfortunatamente, non sembra esserci supporto nativo per l'accesso alle password memorizzate nel portachiavi, e questo non sembra essere un problema abbastanza comune da poter essere una libreria sviluppata attivamente da risolvere esso.

 1
Author: F. Stephen Q, 2016-07-06 16:10:18

L'ho fatto da solo usando la riga di comando, ad esempio eseguendo /usr/bin/security. Tuttavia non ha forti controlli di accesso. Quindi puoi eseguire / usr / bin / security da un terminale per accedere alle stesse password, ma un'app C++ che chiama direttamente nella libreria verrebbe bloccata.

Per questo motivo lo sto usando solo per i token oauth per gli account di social media. Cose che potresti fare allo stesso modo lanciando un browser Web quando hai effettuato l'accesso come utente.

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

 1
Author: Yuri Schimke, 2016-07-24 10:56:48

C'è anche il progetto JNA + Maven qui che non richiede la compilazione di alcun codice nativo nella build. Apparentemente supporta OSX e Windows.

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

Ha meno funzioni di osx-keychain-java, ma supporta Aggiungi e Ottieni password generiche.

<dependency>
  <groupId>net.east301</groupId>
  <artifactId>java-keyring</artifactId>
  <version>1.0.0</version>
</dependency>

Codice di esempio

import net.east301.keyring.Keyring;
import net.east301.keyring.PasswordRetrievalException;

Keyring keyring = Keyring.create();
String pw = keyring.getPassword(service, account);
 0
Author: Yuri Schimke, 2016-07-31 07:33:43