Как сохранить имя пользователя / пароль в связке ключей Mac с помощью Java?

Я хотел бы использовать Mac KeyChain для хранения некоторых комбинаций имени пользователя и пароля для моего приложения Java Swing, которое будет использоваться для подключения к внешним службам от имени пользователя.

Я нашел несколько источников, демонстрирующих, что вы можете получить доступ к объекту java.security.KeyStore, выполнив:

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

Однако я не могу найти никаких примеров того, как вы используете полученное хранилище ключей для фактического хранения / получения имен пользователей и паролей.

Любая помощь будет принята с благодарностью.

Спасибо!


person John Watson    schedule 28.07.2011    source источник
comment
Эта проблема обсуждается здесь: stackoverflow .com / questions / 727812 /. См. Ответ пользователя erickson.   -  person dejuknow    schedule 03.08.2011
comment
Если бы я пошел по этому пути, мне пришлось бы распространять закрытый ключ вместе с приложением. Мне это не кажется лучшим решением. Разве нет способа хранить пароли в связке ключей, как это делают обычные приложения для Mac?   -  person John Watson    schedule 23.08.2011
comment
Похоже, вы пытаетесь использовать java.security.KeyStore для доступа к службам Apple Keychain. KeyStore - это абстрактная оболочка для многих поставщиков. Такой подход ограничивает возможность использования определенных функций реализации. Вот более конкретная оболочка: github.com/conormcd/osx-keychain-java Также вот пример использования службы см. (Рис. 1-3) developer.apple.com/library/ios/documentation/Security/   -  person Frobbit    schedule 07.04.2015


Ответы (3)


Вы не можете получить "пароли Apple Keychain" отсюда "Java KeyStore"

Абстракция хранилища ключей только обертывает сертификаты в цепочке для ключей.

Посмотрите разницу между собственным представлением связки ключей (bash cmd):

security dump ~/Library/Keychains/login.keychain

по сравнению с представлением Java о связке ключей (bash cmd):

keytool -list -storetype KeychainStore -keystore ~/Library/Keychains/login.keychain

Обратите внимание, что включены только сертификаты, и список короче.

Вам нужно будет использовать другую оболочку для Связки ключей, которая может получить доступ ко всем его функциям.

Предложения:

  • github.com/conormcd/osx-keychain-java
  • используйте swig для создания оболочки JNI

Также прочтите собственные документы: Концепции служб связки ключей - Задачи служб связки ключей OS X (см. рис. 1-3)

person Frobbit    schedule 07.04.2015
comment
Вы можете проверить оболочку, чтобы увидеть, не пропустил ли я возможный путь: cr.openjdk.java.net/~michaelm/7113349/7u4/4/jdk7u-osx/new/src/ - person Frobbit; 07.04.2015

Вы могли бы использовать инструмент командной строки 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"
);
person Felix Leipold    schedule 17.12.2017
comment
Это помогает мне хранить учетные данные в цепочке для ключей и в упомянутой вами библиотеке. - person Arefe; 07.08.2019

Руководство по разработке Java для Mac OS X указывает на справочная документация на java.security.KeyStore. Я не знаком с KeyStore, но, возможно, вы найдете там то, что вам нужно.

person Mike Christianson    schedule 28.07.2011
comment
К сожалению, это не помогло. Кажется, это все о хранении ключей и сертификатов, но мне действительно нужно хранить комбинации имени пользователя и пароля. - person John Watson; 28.07.2011