您使用哪个属性在Keychain中存储密码(使用iOS)?
(我用的是Swift。) 我有以下您使用哪个属性在Keychain中存储密码(使用iOS)?,ios,security,swift,keychain,Ios,Security,Swift,Keychain,(我用的是Swift。) 我有以下字典要传递到SecItemAdd() var attributes=[kSecClass as String:kSecClassInternetPassword, kSecAttrAccessible:kSecAttrAccessible仅当未锁定此设备时, kSecAttrDescription:“Alexander的应用程序帐户密码”, kSecAttrAccount:self.usernameField.text,/*这是UITextField的出口*/
字典
要传递到SecItemAdd()
var attributes=[kSecClass as String:kSecClassInternetPassword,
kSecAttrAccessible:kSecAttrAccessible仅当未锁定此设备时,
kSecAttrDescription:“Alexander的应用程序帐户密码”,
kSecAttrAccount:self.usernameField.text,/*这是UITextField的出口*/
kSecAttrServer:“http://www.hausofalexander.tk/“,/*这是我的服务器的域*/
kSecAttrAuthenticationType:kSecAttrAuthenticationTypeHTTPBasic,
kSecValueData:self.passwordField.text];/*这也是UITextField*/
然后我调用SecItemAdd(属性为CFDictionaryRef,nil)
我正在接收errSecParam
(这是错误-50
),因为我正在向SecItemAdd()
传递一个无效参数(attributes
)。我假设这是因为我的属性
变量中有一对kSecValueData
,根据参考,该变量不适用于iOS的kSecClassInternetPassword
:
但是,我完全能够使用kSecValueData
作为属性,并使用Cocoa为其设置一个值(如在Mac开发中)。我制作了一个Mac应用程序来测试它,然后寻找具有钥匙链访问权限的项目,发现它确实存在。然而,这是使用了kSecClassGenericPassword
的ksecclasss
(我不知道这是否相关,但这个测试应用程序是我用Objective-C编写的)。此时,我决定检查在iOS应用程序中使用kSecClassGenericPassword
时哪些属性可用。遗憾的是,kSecValueData
也不能用于该kSecClass
因此,如果kSecValueData
不是kSecClassGenericPassword
,kSecClassInternetPassword
,或者任何其他kSecClass
项目的适用属性,我该在世界上的何处设置密码
我注意到我可以使用ksecatargeneric
与这些kSecClass
项(即kSecClassGenericPassword
和kSecClassInternetPassword
)一起使用,它的值为CFDataRef
。我假设这意味着我需要将NSData
(作为CFDataRef
)传递到此属性,但是作为NSData
传递什么呢?那应该是一本字典吗?这应该是密码字符串的值吗?这是否意味着我可以让任何kSecAttr*
以某种方式重视自己
谢谢你的阅读。如果我把你弄糊涂了,一定要告诉你,我会很乐意进一步详细解释。也许这会有帮助-我已经尝试了一段时间,但是kSecValueData
根本不适用。我尝试了var attributes=[kSecClass as String:kSecClassGenericPassword,kSecAttrAcces…诸如此类…trAccount:self.usernameField.text,kSecValueData as String:self.passwordField.text.dataUsingEncoding(NSASCIIStringEncoding,allowLossyConversion:false)]代码>。在记录应用程序的所有密钥链项目后,我发现kSecValueData
没有被添加为属性。使用kSecGenericItem
是否是一种不好的做法?这在这里工作得很好。我在让这些在模拟器中工作时遇到了问题,但它最终在一台设备上工作。苹果的示例项目帮助我解决了这些问题。