以编程方式存储和检索来自Mac钥匙串的私钥

时间:2011-06-29 13:09:53

标签: objective-c macos keychain private-key

在Mac应用程序中,我需要以安全的方式存储从服务器发送的用于登录用户的私钥,并在需要时以编程方式将其检索回来。我知道钥匙串是存储私钥的最佳位置。有没有可用于实现此目的的示例代码?

我可以使用“Security.framework”的“SecKeychainItemImport”方法将私钥添加到钥匙串,但在从钥匙串中检索私钥时遇到问题。我尝试使用“SecKeychainItemCopyAttributesAndData”和“SecKeychainItemCopyContent”方法从密钥链中获取私钥。但到目前为止没有运气。

我还在博客中读到了提及“.ssh”隐藏文件夹中的私钥存储。但我觉得将私钥存储在钥匙串中可提供更高级别的安全性,以便其他人无法轻松访问私钥。

2 个答案:

答案 0 :(得分:4)

Keychain的一个目的是通过不将其数据暴露给应用程序来保护私钥。为防止意外泄露私钥,默认情况下会标记CSSM_KEYATTR_EXTRACTABLE | CSSM_KEYATTR_SENSITIVE这些项目。即,只能使用SecKeychainItemExport获取数据,并且只能使用密码保护格式。

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

如果由于某种原因您确实需要访问私钥的原始位,则需要在将私钥导入钥匙串时为此做好准备。您需要在keyAttributes的{​​{1}}参数中将CSSM_KEYATTR_EXTRACTABLE设置为keyParams(即没有敏感位)。

答案 1 :(得分:0)