在iOS钥匙串中保存数据

您应该在哪里存储用户数据? 这是有关移动开发中用户数据安全性的最流行和最热门的主题之一。 不幸的是,它仍然没有一种好的实践。 有时,您的后端团队无法实施该解决方案以允许将凭据存储在散列中的设备中,或者您需要在该设备上保存多个帐户🤔。

在本文中,我将向您展示iOS系统中的钥匙串到底是什么,如何使用它来存储数据以及根据将敏感数据存储在设备上的一些最佳做法。 听起来不错👍? 走吧!

iOS系统有一个有趣的东西,称为keychian🔐。 钥匙串只是用于存储所有敏感数据(如密码,证书等)的数据存储。

第二个问题-为什么安全? 因为钥匙串使用的是全面加密。 这意味着用密钥保护其中存储的数据。 密钥是基于唯一的设备数据和该设备的代码生成的(仅所有者知道)。 最小加密算法有128位AES。

自2016年以来,Apple启用了名为iCloud钥匙串的服务,这意味着用户可以在一个AppleID中的设备之间共享他的钥匙串。

嗯……看起来一切都在进行中,并且使用1.2版本的TLS加密进行同步,但是毕竟我意识到具有我所有凭据的文件都位于Apple服务器上的某个地方,这并没有让我感到高兴。 我不确定该解决方案,但我让您选择。

有关钥匙串本身的更多信息,请访问以下Apple支持频道:https://support.apple.com/zh-cn/HT202303

钥匙串是存储敏感数据的唯一相对安全的地方。 据推测,您将应用程序的配置数据保存在UserDefaults中。 但是您必须记住,这不是在此处存储敏感数据的安全场所,因为黑客很容易窃取它(足以访问设备)。 钥匙串并不是那么容易,只有用用户的密码才能破解。

好的,那么我们应该在钥匙串中存储哪些数据?

  • 登录名和密码(哈希)
  • 付款数据
  • 加密算法的密钥
  • 如果我再提醒自己一些东西,我会加it

将数据存储在钥匙串中还有另一个优势-如果用户决定从设备中删除该应用程序,然后又决定再次安装该应用程序,则该数据仍会保存(当然,如果用户不手动删除它,😅 )。

好了,是时候编写一些代码了! 访问钥匙串很容易实现。 Apple为我们完成的几乎全部工作➡️您只需从此处下载示例代码👉https://developer.apple.com/library/content/samplecode/GenericKeychain/Introduction/Intro.html,然后将其粘贴到您的项目结构中。 我总是在钥匙串配置中添加一个额外的结构:

好了,武器库可以使用🔫了。 首先,我们将关心将数据保存在钥匙串中。

注意:在本文中,我仅关注使用钥匙串,以便将数据保存为纯文本。 但是您必须记住有关以加密格式存储数据的信息。

函数setPasswordToKeychain()为我们的登录创建新的钥匙串对象,然后使用savePassword()方法保存密码。 此函数可能会引发错误,因此我正在使用docatch结构。

好的,它工作正常。 现在,我想从钥匙串下载用户名的密码。 我正在创建函数getPassword():

func getPassword(forUser用户:String)-> String? {}

情况很简单-方法以用户的登录名作为参数,然后以钥匙串形式返回密码,如果用户名未存储密码,则返回nil。

就是这样,它起作用了! 如前所述,我仅向您展示了一种从钥匙串保存和读取数据的方法。 请记住,您应该保护您的数据,即使用TouchID或一些额外的加密。

钥匙串还能做什么?

如果您有好奇心(作为开发人员,您应该是😁),我想您已经从Apple复制了支持文件。

如您所见,还有更多功能可以显示钥匙串可以提供的更多功能。 除了保存和读取密码外,钥匙串还允许您更改帐户名(用户登录名):

 变异func namedAccount(_ newAccountName:String)抛出异常 

或删除整个对象:

  func deleteItem()引发 

使用钥匙串非常容易,不需要越来越多的编码工作。 另一种最佳实践-不要对任何数据(例如密码和算法密钥)进行硬编码。 每个设备的此数据均应不同,并且应在运行时生成,即,它可以是从服务器获取的第一个身份验证令牌的哈希。

关于加密,将有单独的文章。

结论很简单-不必将密码存储在设备上。 但是,如果您这样做,请使用钥匙串和几种加密技术。

根据钥匙串本身-如您所见,它不需要太多的编码和一些神秘的知识。 安全性仍然是IT界的热门话题,因此您应特别注意确保用户数据的安全性。

感谢您的访问和阅读👍。 请提供对本文的一些反馈。 您可以在社交上了解我:

  • https://twitter.com/jkornat
  • https://instagram.com/jkornat
  • https://snapchat.com/add/jakornat
  • https://facebook.com/swiftlypl

下次见!

雅各布·科纳托夫斯基(Jakub Kornatowski)