3
Googleでは検出されましたが、迅速にキーチェーンにこの属性を設定する方法については何も見つかりませんでした。 Obj-Cにはいくつかのビットと断片がありますが、キーチェーンとObj-Cのスウィフト使用法の対応はほとんど不可能です。キーチェーンのアクセスをSwiftのkSecAttrAccessibleAfterFirstUnlockに設定するにはどうすればよいですか?
暗号化キーを設定するために既存のコード(Realm Swiftのドキュメント)がありますが、デフォルトからkSecAttrAccessibleAfterFirstUnlockへのアクセスを設定する必要があります。
class func getKey() -> NSData {
let keychainIdentifier = "Realm.EncryptionKey"
let keychainIdentifierData = keychainIdentifier.data(using: String.Encoding.utf8, allowLossyConversion: false)!
// First check in the keychain for an existing key
var query: [NSString: AnyObject] = [
kSecClass: kSecClassKey,
kSecAttrApplicationTag: keychainIdentifierData as AnyObject,
kSecAttrKeySizeInBits: 512 as AnyObject,
kSecReturnData: true as AnyObject
]
var dataTypeRef: AnyObject?
var status = withUnsafeMutablePointer(to: &dataTypeRef) { SecItemCopyMatching(query as CFDictionary, UnsafeMutablePointer($0)) }
if status == errSecSuccess {
return dataTypeRef as! NSData
}
// No pre-existing key from this application, so generate a new one
let keyData = NSMutableData(length: 64)!
let result = SecRandomCopyBytes(kSecRandomDefault, 64, keyData.mutableBytes.bindMemory(to: UInt8.self, capacity: 64))
assert(result == 0, "Failed to get random bytes")
// Store the key in the keychain
query = [
kSecClass: kSecClassKey,
kSecAttrApplicationTag: keychainIdentifierData as AnyObject,
kSecAttrKeySizeInBits: 512 as AnyObject,
kSecValueData: keyData
]
status = SecItemAdd(query as CFDictionary, nil)
return keyData
}
これは私にヘッドバンギングの時間を節約しました(そして私はメタリカが関与していないことを認めます) –