Swift 中的“清零”敏感字符串数据

Posted

技术标签:

【中文标题】Swift 中的“清零”敏感字符串数据【英文标题】:"Zero out" sensitive String data in Swift 【发布时间】:2018-01-31 18:13:51 【问题描述】:

用户在文本字段中输入他们的密码。我将一个实例变量设置为此值:

let password = passwordTextField.text!

我想确保这些数据不会保留在任何地方,因此我想将这些数据“归零”。

这是否像我完成后将其设置为零一样简单?或者将其设置为空字符串然后为零?

【问题讨论】:

对比forums.developer.apple.com/thread/44121:“这个要求基本不可能达到。” ***.com/a/14296416/3141234 【参考方案1】:

这些是一般的 UI 安全提示(来自 Vandad Nahavandipoor 编写的 ios 7 编程食谱)

• 确保用户将所有密码和安全字段输入到实例中 UITextFieldsecureTextEntry 属性设置为 YES。

• 如果用户在包含个人信息的屏幕上,例如用户的信用 卡号或家庭住址,设置应用主窗口的隐藏属性 applicationWillResignActive: 应用程序委托的方法中的 YES,以及 在applicationDidBecomeActive: app 委托方法中将相同的属性设置为 NO(以显示窗口)。这将确保 iOS 截取的屏幕截图 进入后台时,您的应用程序的 UI 将不包含您的任何窗口 里面的内容。 Apple 推荐此方法。

• 确保在发送之前验证用户在文本字段/视图中的输入 他们到服务器。 • 使用您在本章中学到的机制,保护用户的输入,如果 您将其存储在磁盘上的文件中或keychain 中。

• 在您接受密码或数字代码进行身份验证的屏幕上, 一旦视图控制器不再出现在屏幕上,清除那些密码/代码字段 因为用户不再需要它们。如果您不放弃所有权 在这些视图控制器中,它们的内容将保留在内存中。这包括 这些视图控制器上的安全文本字段条目。最好处理掉内存 处理完这些数据后立即包含敏感信息。

【讨论】:

这并不一定会将内存归零。如果password 的缓冲区不是唯一引用的,则其他一些引用将保持缓冲区完整 @Alexander 那么如何处理字符串变量,使其“归零”/清除? -谢谢 @vikzilla 我不知道,我正在研究它【参考方案2】:

我认为不可能确保系统上不会留下任何数据痕迹。正如其他答案所建议的那样,您可以nil 变量,但不能保证该值不会保存在系统某处的内存中。

我听说有人将敏感数据存储在 char 数组中,但即使这样也不能保证它可以从内存中清除,但是如果使用这种方法可能更难追踪数据。但是,我建议不要在您的特定情况下使用此方法,因为正如 Alexander 指出的那样,您可能必须编写自己的 UI 元素。

【讨论】:

"将敏感数据存储在 char 数组中" 这将要求您编写自己的 UI 元素,这些元素永远不会使用 ObjC/Swift(可以复制结构,可以为对象起别名)作为后备存储。 @Alexander Ya 我同意将数据存储在字符数组中对于这种特殊情况可能没有意义。我只是认为这将有助于说明清除系统中的所有数据痕迹是多么困难。

以上是关于Swift 中的“清零”敏感字符串数据的主要内容,如果未能解决你的问题,请参考以下文章

在连接字符串中排除敏感数据的优缺点?

c语言 关于字符数组和整型数组清零

Swift要求用户允许访问照片库

自定义一个 Jackson 转换注解完成敏感数据的隐藏

自定义一个 Jackson 转换注解完成敏感数据的隐藏

在“Swift 3”中的字符串中查找换行符