Храните и извлекайте закрытый ключ из связки ключей Mac программно

В приложении Mac у меня есть требование хранить закрытый ключ, отправленный с сервера для вошедшего в систему пользователя, безопасным способом и извлекать его обратно, когда это необходимо программно. Я знаю, что связка ключей — лучшее место для хранения закрытого ключа. Есть ли какой-нибудь пример кода для достижения этого?

Я могу добавить закрытый ключ в цепочку для ключей, используя метод «SecKeychainItemImport» для «Security.framework», но у меня возникают проблемы с получением закрытого ключа из цепочки для ключей. Я попытался использовать методы «SecKeychainItemCopyAttributesAndData» и «SecKeychainItemCopyContent» для получения закрытого ключа из цепочки для ключей. Но пока не повезло.

Я также читал в блогах, что хранилище закрытого ключа находится внутри скрытой папки «.ssh». Но я чувствую, что хранение закрытого ключа внутри цепочки для ключей обеспечивает еще один уровень безопасности, чтобы кто-то еще не мог получить легкий доступ к закрытому ключу.


person Subhash    schedule 29.06.2011    source источник
comment
Привет @Subhash, чей ключ ты хранишь? Закрытый ключ, который вы сгенерировали для пользователя, или закрытый ключ вашего приложения?   -  person Perception    schedule 29.06.2011
comment
Закрытый ключ генерируется для пользователя. Сервер сгенерирует закрытый ключ для пользователя на основе информации, предоставленной пользователем при первой попытке входа в систему.   -  person Subhash    schedule 29.06.2011


Ответы (2)


Одной из целей цепочки для ключей является защита закрытых ключей, не раскрывая их данные приложению. Чтобы предотвратить случайное раскрытие закрытого ключа, эти элементы по умолчанию помечены CSSM_KEYATTR_EXTRACTABLE | CSSM_KEYATTR_SENSITIVE; т. е. получить их данные можно только с помощью SecKeychainItemExport и только в формате, защищенном паролем.

В структуре безопасности есть API-интерфейсы, которые шифруют/дешифруют/подписывают/проверяют и т. д. данные с использованием предоставленного элемента ключа, даже не помещая необработанные данные ключа в адресное пространство приложения. (Эти операции обычно выполняются отдельным привилегированным процессом.)

Если по какой-то причине вам нужен доступ к необработанным битам закрытого ключа, вам нужно подготовиться к этому во время импорта закрытого ключа в цепочку для ключей. Вам нужно установить keyAttributes в CSSM_KEYATTR_EXTRACTABLE (т. е. без чувствительного бита) в параметре keyParams параметра SecKeychainItemImport.

person Karoy Lorentey    schedule 29.10.2011

Да, брелок - это то, что вы бы использовали здесь. Вы хотите сначала прочитать документацию, а затем посмотреть пример кода Apple.

http://developer.apple.com/library/mac/#documentation/Security/Conceptual/keychainServConcepts/01introduction/introduction.html

http://developer.apple.com/library/ios/#samplecode/GenericKeychain/Introduction/Intro.html

person Ken Aspeslagh    schedule 29.06.2011
comment
Спасибо за ответ. Я ищу для хранения/получения закрытого ключа в приложении Mac. Ссылка на пример кода относится к iPhone. Более того, я не ищу для хранения имени пользователя и пароля. Я специально ищу программное управление закрытыми ключами в Mac. - person Subhash; 01.07.2011