您使用哪个属性在Keychain中存储密码(使用iOS)?

时间:2015-01-13 21:27:53

标签: ios security swift keychain

(我使用Swift。)

我将以下Dictionary传递给SecItemAdd()

var attributes = [kSecClass as String: kSecClassInternetPassword, kSecAttrAccessible: kSecAttrAccessibleWhenUnlockedThisDeviceOnly, kSecAttrDescription: "Alexander's Application Account Password", kSecAttrAccount: self.usernameField.text, /* This is an outlet to a UITextField */ kSecAttrServer: "http://www.hausofalexander.tk/", /* This is my servers' domain */ kSecAttrAuthenticationType: kSecAttrAuthenticationTypeHTTPBasic, kSecValueData: self.passwordField.text]; /* This is also and outlet to a UITextField */

然后我致电SecItemAdd(attributes as CFDictionaryRef, nil)

我收到errSecParam(错误-50),因为我将无效参数(在这种情况下为attributes)传递给SecItemAdd() 。我假设这是因为我kSecValueData变量中attributes的一对不适用于iOS的kSecClassInternetPassword根据参考: Make sure you scroll down a bit to the kSecClassInternetPassword item to see the applicable attributes for a kSecClass of this type.

但是,我完全能够使用kSecValueData作为属性并使用Cocoa为其设置值(如在Mac开发中)。我已经制作了一个Mac应用程序来测试它然后用Keychain Access查找项目,发现它确实存在。但是,这是使用kSecClass kSecClassGenericPassword(我不知道这是否相关,但这个测试应用程序我是用Objective-C编写的)。此时,如果我在iOS应用程序中使用kSecClassGenericPassword,我决定检查哪些属性可用。遗憾的是,kSecValueData也无法使用kSecClass

因此,如果kSecValueData不适用于kSecClassGenericPasswordkSecClassInternetPassword或任何其他kSecClass项的适用属性,我在世界的哪个位置设置密码?

我注意到我允许kSecAttrGeneric使用这些kSecClass项(即kSecClassGenericPasswordkSecClassInternetPassword)并且它需要一个值CFDataRef。我假设这意味着我希望将NSData(作为CFDataRef)传递给此属性,但我将如何传递给NSData?那应该是Dictionary吗?这应该是密码NSASCIIStringEncoding的{​​{1}}值吗?这是否意味着我可以自己制作任何String值?

感谢阅读。如果我对你感到困惑,请告诉我,我会愉快地解释一下。

0 个答案:

没有答案