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

Posted

技术标签:

【中文标题】SwiftUI / iOS / iPhone如何在存储之前加密数据/图像以及在哪里/如何在本地存储,一般最佳实践?【英文标题】:SwiftUI / iOS / iPhone how to encrypt data/ image before storing and where / how to store locally, general best practice? 【发布时间】:2021-06-14 00:17:47 【问题描述】:

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

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

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

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

都在同一个视图中。

两个表单域:

名字:… 姓氏:……

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

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

现在做所有标准的东西,这很简单。

但是。

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

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

stuff 将在真正的应用程序中使用非对称加密进行加密(我理解得很好,这在这里并不那么重要)。

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

我的问题是,如果可能的话,最好的地方代码在哪里可以用一些基本的例子来做到这一点。我知道这有点主观,但只是简单而明显的事情。单击按钮,运行此函数,执行此类操作等。

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

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

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

【问题讨论】:

【参考方案1】:

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

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

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

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

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

【讨论】:

至于加密,虽然(有点)离题,但您将使用非对称加密,也称为公钥加密,因此不必隐藏任何硬编码的“公钥”。跨度>

以上是关于SwiftUI / iOS / iPhone如何在存储之前加密数据/图像以及在哪里/如何在本地存储,一般最佳实践?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Xcode 和 SwiftUI 分离 iPad 和 iPhone 应用程序

SwiftUI:如何只为 iPhone 显示一些工具栏按钮

将表单附加到边缘[iOS/SwiftUI]

SwiftUI 工作表在第一次呈现时被关闭

如何分享 iOS 应用的交互式演示

SwiftUI 如何调整不同的屏幕尺寸