每个iOS应用程序都必须具备应用程序安全性

应用程序安全性是软件开发最重要的方面之一。

我们应用的用户希望他们的信息被保密。 我们的敏感应用程序数据不应简单地泄露出去。

幸运的是,在本文中,我们将讨论开发人员在应用安全性方面所犯的错误以及如何轻松修复它们。

将敏感数据存储在错误的位置

我从AppStore研究了多个应用程序,其中许多应用程序都在犯同样的错误,将敏感数据存储在不属于它们的地方。

如果要将敏感数据存储在UserDefaults ,则可能会UserDefaults应用程序信息的风险。

UserDefaults只是作为属性列表文件存储,位于应用程序的Preferences文件夹中。 它们会保存在我们的应用中,而不会以任何形式进行加密。

基本上,通过使用示例中的iMaczing这样的第三方mac应用程序,甚至无需越狱设备,您就可以轻松查看从AppStore下载的任何应用程序的UserDefaults数据。

这些Mac应用程序经过专门设计,可让您浏览和管理iPhone上的第三方应用程序文件。 而且,您可以轻松浏览任何应用程序的UserDefaults

促使我写这篇文章的原因是,我发现从AppStore安装的许多应用程序都将其敏感数据写在User Defaults上。

例如访问令牌,活动可更新订阅标志,可用硬币数量等。

从免费使用付费功能到入侵网络层等等,所有这些数据都可以轻松检索和更改,并损坏应用程序。

正确的做法

在iOS应用程序上保存数据时,请始终牢记一件事, UserDefaults旨在仅保存少量数据,例如应用程序内用户的首选项,这是完全不敏感的。

为了保存我们的应用程序敏感数据,我们应使用Apple提供的安全服务。

钥匙串服务API通过为您的应用提供一种将少量用户数据存储在称为钥匙串的加密数据库中的方法,可以帮助您解决这些问题。

在钥匙串中,您可以自由保存用户明确关心的密码和其他机密信息,例如信用卡信息,甚至是简短的敏感便笺。

您还可以存储由证书,密钥和信任服务管理的项目,例如加密密钥和证书。

钥匙串服务API

下面我们将描述如何在钥匙串中保存用户密码。

查询字典部分kSecClass:kSecClassGenericPassword指示该项目是密码,钥匙串服务可从中了解数据需要加密。

然后,通过使用创建的查询调用SecItemAdd ,将新密码添加到钥匙串中。

检索数据类似

我们可以编写一个简单的测试来确保正确保存和检索数据

如果您必须保存多个密码,一开始使用Keychain API似乎有点复杂。我鼓励您为其创建外观,以帮助您根据应用程序使用情况以最佳方式保存和修改数据。

如果您想进一步了解外观模式以及如何为复杂的子系统创建简单的包装器,那么本文将对您有很大帮助。

另外,有许多开源库使Keychain API的使用更加简单。 其中一些是SAMKeychain和SwiftKeychainWrapper。

保存密码并执行身份验证

在我作为iOS开发人员的职业生涯中,我看到相同的错误不断重复出现。

很多时候,开发人员要么将原始密码保存在应用程序中以重复使用,要么直接使用用户名和密码发出登录网络请求。

如果您将密码直接存储在UserDefault那么现在应该知道本文第一部分提供的信息UserDefault您造成多少风险。

将密码保存到钥匙串可以提高安全性,但是,再次,我们应该始终通过初始加密将密码和其他敏感信息保存到钥匙串或其他地方。

假设攻击者可以通过钥匙串安全性进行黑客攻击或通过我们的网络进行攻击,从那里他可以直接以原始文本的形式检索我们的密码。

更好的方法是存储密码,并将其用于登录请求,作为为此密码构建的哈希。

加密敏感数据

自己实现散列可能非常复杂且过大,因此在本文中,我们将使用开源iOS库CryptoSwift的帮助。

CryptoSwift是在Swift中实现的标准安全加密算法的不断增长的集合。

让我们尝试使用CryptoSwift提供的算法在钥匙串上保存和检索密码。

此方法使用帐户和密码,并将散列的字符串而不是直接字符串保存在钥匙串上。

让我们分解一下这种方法正在发生的事情

  • salt是用于混合密码的唯一字符串。
  • sha256完成类型SHA-2哈希
  • HKDF是基于基于哈希的消息认证码(HMAC)的简单密钥派生功能(KDF)

我们制造盐以使我们更容易受到攻击。

如果我们仅对密码进行哈希处理,则黑客可能会列出最常用的密码,并创建其哈希值并将其与我们创建的哈希值进行比较。 然后可以轻松找到给定帐户的密码。

现在,我们可以使用我们的帐户和自定义密钥而不是直接密码来对服务器进行身份验证。

当然,应用程序和服务器应共享相同的盐。 后端将不得不比较使用相同算法创建的相同密钥,以验证用户。

通过使用这种方法,我们可以将我们的安全性提高到一个新的水平,并使攻击应用程序成为一项高度复杂的任务。

结论

为我们的应用程序实现安全性应该是一项不容忽视的任务。

最初,在本文中,我们讨论了将敏感数据保存到UserDefaults可能引起的问题。 我们讨论了为什么必须将它们保存在钥匙串上,以避免攻击者轻易查看它们。

在第二部分中,我们更多地讨论了通过首先加密来保存敏感数据来将安全性提高到一个新的水平,并且还讨论了在以我们的案例用户身份共享敏感数据时与服务器进行通信的正确方法。

如果您喜欢本文,请确保鼓掌以表示支持。

跟随我查看更多文章,这些文章可以使您的iOS开发人员技能更上一层楼。

如果您有任何疑问或意见,请随时在此处留言或发送电子邮件至arlindaliu.dev@gmail.com。