Tag: 钥匙串

安全地将密码密钥存储在iOS钥匙串中

在我的安全系列#1中,移动安全。 我已经介绍了移动安全性的基本知识。 现在,让我们弄脏双手。 让我简要介绍一下如何在iOS钥匙串系统中创建和存储加密密钥。 开始使用 加密密钥应存放在安全的地方。 密钥存储不当会导致数据泄露。 在iOS中,有两个框架可确保加密密钥的安全性。 本地认证框架 安全框架 在本文中,我将介绍两者并解释它们如何通过结合使用这两个框架来保护加密密钥。 本地认证框架 本地身份验证框架用于管理生物识别,例如TouchID和FaceID。 本地身份验证框架不允许应用访问系统内部的生物特征数据。 它就像在应用程序和硬件支持的安全区域之间进行通信的代理一样。 本地身份验证框架使应用程序需要用户存在才能访问敏感信息,例如加密密钥。 LAContext是本地身份验证框架中的类,用于桥接应用程序和保护安全区域。 LAContext()。evaluatePolicy( LAPolicy.deviceOwnerAuthenticationWithBiometrics, localizedReason:“原因”){(成功,错误)在 //处理返回 } 但是,以上方法不足以保护敏感数据。 它只是提示您评估用户的指纹或面部。 为了保护敏感数据,我们应该通过安全框架将敏感数据存储到钥匙串中。 安全框架 安全框架提供了一些方法来生成加密密钥,将系统密钥链中的密钥存储和检索为Keychain Item 。 要生成密钥对,我们可以调用以下方法: // 1.创建密钥访问控制 守护让accessControl = SecAccessControlCreateWithFlags( kCFAllocatorDefault, kSecAttrAccessibleWhenUnlockedThisDeviceOnly, [.privateKeyUsage,.biometryCurrentSet], 零) 其他{ fatalError(“无法设置访问控制”) } // 2.创建关键属性 let属性:[String:任何] = [ kSecClass作为字符串:kSecClassKey, kSecAttrKeyType作为字符串:kSecAttrKeyTypeRSA kSecAttrKeySizeInBits作为字符串:2048, kSecPrivateKeyAttrs作为字符串:[ kSecAttrIsPermanent as String:true, kSecAttrApplicationTag作为字符串:“ […]

在iOS中测试钥匙串

今天,我将Keychain升级到Swift 4,并借此机会修复了测试。 测试通过了macOS,但在iOS上,我收到-25300错误 var status = SecItemCopyMatching(以CFDictionary形式查询,无) 这是因为没有测试目标的钥匙串权利。 但这是一个框架,我该如何添加权利solution解决方案是使用测试主机托管XCTest测试。 看到我的请求 创建测试主机目标 首先创建一个iOS应用作为测试主机 启用钥匙串功能 然后启用“钥匙串”功能,让Xcode为您自动创建权利文件。 请注意,您只能进入“ Keychain group 。 您无需转到Apple Developer dashboard即可进行任何配置 指定测试主机 然后在测试目标中,使用$(BUILT_PRODUCTS_DIR)/TestHost_iOS.app/TestHost_iOS指定Test Host 现在再次运行测试,它应该通过 原始故事https://github.com/onmyway133/blog/issues/92

涉足钥匙扣服务

如果您曾经构建过iOS应用程序,则可能遇到了必须代表用户存储敏感信息的情况。 为此,Apple的钥匙串服务就是您的最佳选择。 since自从iOS SDK的第一个公开版本(iOS 2.0)以来,钥匙串服务就已经成为Apple安全框架的一部分。 与UserDefaults不同,钥匙串为您提供了一种安全的方式来在加密的数据库中存储密码,信用卡信息甚至便笺。 在我职业生涯的早期,由于苹果提供的API不友好,我被告知要使用框架包装Keychain Services。 尽管我当时对第三方框架提供的界面感到非常满意,但我还是想了解该平台提供的服务的来龙去脉。 您可以在下面阅读有关我的学习内容。 钥匙串服务包括两个主要部分:一个加密的数据库(由SecKeychain类表示)和插入到数据库中的项(由SecKeychainItem类表示)。 在iOS中,只有一个钥匙串存储(封装了您的iCloud钥匙串),除了CRUD操作之外,没有API可以创建或操作默认钥匙串。 钥匙串会自动同时与设备锁定和解锁,因此无法进行未经授权的访问。 另一方面,在Mac OS中,您可以创建和管理自己的钥匙串存储(安装时会创建4个:登录,iCloud,系统,系统根-您可以在钥匙串访问应用程序中对其进行浏览)。 SecKeychainItems是隐藏在Security框架内的不透明类型,由两部分组成: 数据和一组属性 ,这些属性有助于标识和存储元数据或控制对存储项的访问。 当将要插入新项目时,钥匙串服务首先加密数据,然后将其与公共属性包装在一起。 请参见下图。 由于SecKeychainItems处于隐藏状态,因此Apple提供了一组API以使用CFDictionary类型与钥匙串进行交互。 您可以添加,修改,删除和搜索特定的钥匙串项,甚至可以修改其访问控制。 这些是特殊类型的属性,用于定义如何处理钥匙串项目。 截至2018年,共有5种物品类别: 通用密码项目 互联网密码项目 证书项目 加密关键项目 身份项目 每个类都支持一组特殊的属性。 您可以通过单击上面提供的链接来检出它们。 Apple定义了一组键值对,以帮助您使用字典为键链项目设置属性。 这些键值项按上述钥匙串项类型分类: 常规项目属性键 密码属性键 证书属性密钥 加密密钥属性密钥 认证类型值 关键类别值 同步性值 还有很多 … 现在,为了帮助您更好地理解这一点,我将向您展示如何将Internet密码存储在钥匙串中。 观察到我将密码用作钥匙串项目的数据,并使用了另外三个属性来提供其他信息。 在我的示例中, kSecClass告诉我们要存储在钥匙串中的项目的类型, kSecAttrServer是服务器地址属性,特定于Internet密码类型的项目,而kSecAttrAccount拥有特定Internet服务的帐户。 一旦将数据安全地存储在钥匙串中,您就可以通过它们的属性来查询这些项目。 存储有关特定元素的足够信息将帮助您将搜索结果范围缩小到要查找的内容。 使用kSecAttrLabel,您还可以标记商品,以便以后更好地找到它。 让我们看看如何检索数据。 要更新或删除项目,可以使用更简单的查询,而无需让Keychain返回任何属性( kSecReturnAttributes , kSecReturnData […]

iOS钥匙串中受密码保护的条目

您将拥有应用程序的名称,而不是“ keychain-sample”。 请注意,在这种情况下, SecItemCopyMatching调用是同步的,必须在后台线程上完成以防止主线程阻塞。 如果用户输入了错误的密码,那么iOS会自动重新显示提示。 在用户输入正确的密码或点击“取消”或超过允许的最大尝试次数(由系统定义的情况下,如果我没有记错的话,为5次), SecItemCopyMatching调用将不会返回。 使用LAContext.evaluateAccessControl 如果我们要手动控制尝试次数,并且还避免长时间运行阻塞调用SecItemCopyMatching则可以使用稍微不同的方法: 在这里,我们创建一个LAContext实例,并为它调用带有operation: .useItem evaluateAccessControl operation: .useItem 。 这个evaluateAccessControl调用将触发与我们之前相同的UI提示。 但是,后续的SecItemCopyMatching调用不会被阻止。 同样值得注意的是,由于这个原因, localizedReason参数在此evaluateAccessControl调用中被忽略,并且UI提示与前面的情况完全相同。 为SecItemCopyMatching准备数据的关键点是将LAContext实例设置为kSecUseAuthenticationContext密钥的值,并且还为kSecUseAuthenticationUI设置kSecUseAuthenticationUIFail值。 在这种情况下,第一次尝试输入错误密码后,我们的loadPassProtected调用将失败,如果要允许第二次尝试,我们将必须手动重复该过程。 这样我们就可以控制尝试次数。 顺便说一句,如果我们在SecItemCopyMatching调用中不使用kSecUseAuthenticationUIFail ,则系统将以与以前相同的方式自动处理错误的密码。 并且SecItemCopyMatching将变得阻塞。 自定义用户界面,而不是系统提示 现在,如果系统密码提示不适用于我们的应用程序设计怎么办? 看来我们可以实现自己的用户界面来输入密码,只需将密码值提供给钥匙串API。 为此,我们必须创建一个LAContext实例,并将从用户获得的密码设置LAContext实例。 与将条目保存在钥匙串中时的方式相同: 在这里,我们还使用了非阻塞的SecItemCopyMatching调用。 还应注意,您需要一个真实的设备来测试此代码。 它在模拟器中不起作用。 我看到有人提到它在关闭密码的真实设备上不起作用,例如: iOS钥匙串– LAContext.setCredential(data,.applicationPassword)在模拟器上返回false 似乎applicationPassword与设备的系统密码结合使用。 因此,… stackoverflow.com 但是我的测试表明,至少在iOS 12中,当我关闭设备上的密码时,它可以正常工作。 如本文中所述,用于创建和读取受密码保护的条目的示例代码可以在github上的该项目中找到: algrid /钥匙串样本 iOS钥匙串用法示例。 通过在GitHub上创建一个帐户来为algrid / keychain-sample开发做出贡献。 github.com 我希望这些信息对提高您的iOS应用程序的安全性很有帮助。 如果您发现问题或有任何建议,请告诉我。

如何修复iOS应用程序代码签名错误?

在过去的一周中,我一直试图解决这个困扰我的问题,并在长期努力的最后解决了这个问题。 这不是一个常见的解决方案。 您真的需要这篇文章进行修复吗? 也许。 因为在调查期间,我阅读了太多论坛(包括中文论坛,但没有阅读,只能看一下:)),文章,StackOverflow条目等,但是没有一个对我有帮助。 因此,我想为该问题创建一个修补程序编译 。 在开始之前,您可以在下面找到我的场景。 我有一个Cordova应用程序,并通过Cordova CLI生成了一个构建。 但这通常与本地ios应用程序构建没有什么不同。 实际上,直到MacOS和XCode更新,它都可以正常工作。 在Mojave和XCode 10更新之后,我无法在Jenkins上生成构建。 在下面的错误连续出现。 确切地说,这是与钥匙串和证书有关的问题。 ………. errSecInternalComponent Command /usr/bin/codesign failed with exit code 1 我们可以开始解决。 您应该知道那些常见的解决方案位于列表的开头。 常见解决方案1:检查有效证书 您应该检查钥匙串,以正确添加有效证书。 您可以通过“钥匙串访问”应用程序执行此操作,也可以通过终端执行以下命令。 安全查找身份-vp代码签名 您的证书必须在结果中。 如果不是,请删除证书,然后再次将其添加到钥匙串中。 常见解决方案2:锁定和解锁钥匙串 这里的另一个最常见的解决方案。 在终端中运行以下命令。 您应该添加自己的钥匙串名称和密码。 安全锁-钥匙串临时钥匙串 安全解锁钥匙串-pp @ ssw0rd临时钥匙串 在这种情况下,使用的钥匙串名称为“ temp”,其密码为“ p @ ssw0rd”。 另外,您可以在以下命令中找到钥匙串的完整路径,并且可以使用它代替钥匙串名称(temp)。 安全列表钥匙串 常见解决方案3:重启机器 可以看出它很有趣,但是大多数网站都强烈支持这种解决方案。 如果添加新证书,重新启动计算机可能会很有用。 您可以使用以下命令重新启动。 须藤重启 通用解决方案4:将“钥匙串密码”设置为分区列表 此解决方案解决了密码提示问题。 […]