SwiftUI / iOS / iPhone 如何在存储前加密数据/图像以及在何处/如何在本地存储,一般最佳实践?

SwiftUI / iOS / iPhone how to encrypt data/ image before storing and where / how to store locally, general best practice?

我是 SwiftUI (iOS App Ver 14.x) 的新手,因为我通常使用 Xamarin。

在这种情况下,我需要专门用 SwiftUI 编写的应用程序。 (我知道有些东西仍然需要 UIKit)。

虽然我一般来说很难掌握存储东西的位置和方式,但我已经明白了。

例如(大大简化)让我们说我想要以下内容:

全部在同一个视图中。

两个表单域:

名字:…… 姓氏:...

显示“添加照片”的按钮。

一个按钮,上面写着“本地保存”(N/a 但仅供参考,稍后会上传到有时并不总是可用的网络服务)。

现在做所有标准的事情,这是非常简单的。

但是。

我想加密表单输入(一旦转换为 JSON,注意我可以很容易地转换为 JSON)。

我还想在存储图像之前对其进行加密。 (真正的应用程序有不止一张图片)。

内容将在真实应用程序中使用非对称加密进行加密(我理解得很好,这在这里也不太相关)。

但是为了举例,我很乐意使用一些简单的方法将 JSON 和图片“加密”为两个单独的文件,只是为了展示这个想法。 XOR 它或一些简单的东西来显示。

我的问题是,如果可能的话,最好的 地方 代码明智地用一些基本示例来做到这一点。我知道这有点主观,但只是简单明了的事情。单击按钮,运行 这个功能,做这类事情等

我在哪里存储 东西(我到处都能找到)?老实说,这是我困惑的主要来源。

我的理解是您将使用 FileManager 对象和文档目录(尽管我不确定这是否是最佳实践,甚至是正确的位置。

客户的要求是,出于合规性原因,不得以未加密的方式存储任何内容(完全忽略 Apple 的任何好坏)。

是的,您可以使用文件管理器将其存储在文档文件夹中:

FileManager.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false)[0]

至于加密,如果您在将数据写入磁盘之前对其进行加密,那么它们将被加密...

一个问题是加密密钥也必须安全存储。为此,我通常在第一次使用时生成密钥并将其存储在钥匙串中。在代码中对密钥进行硬编码并不安全,因为它使所有用户的密钥都相同,并且二进制文件可以(不确定有多容易)进行逆向工程。我们必须相信 Apple 的钥匙串是安全的。一些越狱检查也可能有助于听力。

另请注意,与其他应用程序数据(UserDefaults、文件等)不同,钥匙串在重新安装应用程序时不会清除!!!这可能是头痛的主要原因。如果需要,您可以通过 运行 一段代码来解决此问题,以便在应用程序安装后第一次运行时清除钥匙串(例如,通过在 UserDefaults 中保留一个标志,在重新安装应用程序时清除该标志) .