objectivec-以编程方式从Mac钥匙链中存储和检索私钥



在Mac应用程序中,我需要以安全的方式存储从服务器发送给登录用户的私钥,并在需要时通过编程将其取回。我知道钥匙扣是存放私钥的最好地方。有什么样的代码可以实现这一点吗?

我可以使用"Security.framework"的"SecKeychainItemImport"方法将私钥添加到密钥链中,但从密钥链中检索私钥时遇到问题。我已经尝试使用"SecKeychainItemCopyAttributesAndData"one_answers"SecKeychainItemCopyContent"方法从密钥链中取回私钥。但到目前为止运气不佳。

我也在博客中读到过提到".ssh"隐藏文件夹中的私钥存储。但我觉得,将私钥存储在钥匙链中又提供了一个安全级别,这样其他人就无法轻松访问私钥。

Keychain的一个目的是通过不向应用程序公开私钥的数据来保护私钥。为了防止意外暴露私钥,这些项默认标记为CSSM_KEYATTR_EXTRACTABLE | CSSM_KEYATTR_SENSITIVE;即,只能使用SecKeychainItemExport获取他们的数据,并且只能使用密码短语保护的格式。

安全框架中有一些API可以使用提供的密钥项加密/解密/签名/验证等数据,而无需将原始密钥数据放入应用程序的地址空间。(这些操作通常由一个单独的特权进程完成。)

如果出于某种原因,您确实需要访问私钥的原始位,则需要在将私钥导入密钥链时为此做好准备。您需要在SecKeychainItemImportkeyParams参数中将keyAttributes设置为CSSM_KEYATTR_EXTRACTABLE(即没有敏感位)。

是的,Keychain就是您在这里使用的。您需要先阅读文档,然后查看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

最新更新