程序化地从Mac钥匙串中存储和检索私钥

6
在一个Mac应用程序中,我需要以安全的方式存储从服务器发送给已登录用户的私钥,并在需要时通过编程方式检索它。我知道keychain是存储私钥的最佳位置。是否有可用的示例代码来实现这一点?
我能够使用"Security.framework"的"SecKeychainItemImport"方法将私钥添加到keychain中,但无法从keychain中检索回私钥。我尝试了"SecKeychainItemCopyAttributesAndData"和"SecKeychainItemCopyContent"方法来从keychain中获取私钥,但是一直没有成功。
我还阅读了博客文章,提到私钥存储在".ssh"隐藏文件夹中。但我认为将私钥存储在keychain中提供了更高的安全级别,使其他人无法轻易访问私钥。

你好@Subhash,你正在存储谁的密钥?是为用户生成的私钥还是你应用程序的私钥? - Perception
1
为用户生成私钥。当用户首次尝试登录时,服务器将根据用户提供的信息为其生成私钥。 - Subhash
2个回答

4
Keychain的一个目的是通过不将私钥数据暴露给应用程序来保护私钥。为了防止意外暴露私钥,这些项目默认被标记为CSSM_KEYATTR_EXTRACTABLE | CSSM_KEYATTR_SENSITIVE;即,只有使用SecKeychainItemExport才能获取它们的数据,并且只能以受密码保护的格式获取。
安全框架中有一些API可以使用提供的密钥项加密/解密/签名/验证等数据,而无需将原始密钥数据放入应用程序的地址空间。(这些操作通常由单独的特权进程执行。)
如果出于某种原因确实需要访问私钥的原始位,请在将私钥导入钥匙串时进行准备。您需要在SecKeychainItemImportkeyParams参数中将keyAttributes设置为CSSM_KEYATTR_EXTRACTABLE(即没有敏感位)。

0

2
谢谢您的回复。我正在寻找在Mac应用程序中存储/检索私钥的方法。示例代码链接与iPhone相关。此外,我不是在寻找存储用户名和密码的方法。我具体地寻找在Mac上通过编程方式进行私钥管理的方法。 - Subhash

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接