【问题标题】:Storing encryption key within iOS app?在 iOS 应用程序中存储加密密钥?
【发布时间】:2016-04-03 10:50:11
【问题描述】:

我需要在我的应用程序中存储一个加密密钥,以便它可以使用相同的密钥从公共商店加密和上传数据以及下载和解密数据。这样,中间的任何其他方都无法读取数据。

我担心有人可能劫持我的应用。归档我的应用后,是否有人可以读取应用中保存的硬编码加密密钥?

【问题讨论】:

  • 是的,这是可能的 - 您存储在客户端中的任何信息都可能被攻击者读取。
  • “劫持我的应用”是什么意思?
  • @zaph 使用越狱设备并查看我的应用程序的文件?我不知道这个过程是什么,或者什么是可能的。
  • @Andrew 更新了我的答案,回复是渴望评论。

标签: ios xcode swift encryption archive


【解决方案1】:

您可以通过安全连接 (HTTPS) 从服务器请求它,然后将其保存在 keychain 中以供以后检索,而不是将加密密钥存储在应用程序包中。

您可以通过添加SSL pinning 或/和其他安全措施来为https 连接添加更多安全层。

此外,您可以在用户每次登录时生成不同的加密密钥,如果商店 API 支持,您可以使为用户生成的所有密钥失效,例如他的手机被盗。

【讨论】:

  • 你如何验证请求者的身份?
【解决方案2】:

如果密钥在应用程序包中,则有可能被发现,但这样做并不安全。正如@Cristik 所说,向服务器验证用户身份并在此时下载密钥。

要保护密钥,您可以做的最好的事情是将密钥保存在钥匙串中。

保护设备所有者非常困难,并且更多地属于 DRM。

保护非所有者取决于所有者设置了良好的密码/密码。

保护传输中的数据(上传/下载)很容易,使用 https,确保服务器是最新的(TLS 1.2 和完美前向保密)并将服务器证书固定在应用程序中。

更新:

在 ipa 中,只有可执行文件被加密,因此可以从下载中访问其他文件。如果文件被加密,攻击者将需要加密密钥,而且密钥可能很强大:随机字节。

但是应用程序需要加密密钥,所以问题是应用程序如何知道密钥而不是攻击者。加密确实增加了需要获取密钥的工作因素。

有反汇编工具,所以如果密钥在代码中,有经验的攻击者可以找到它。

如果密钥来自服务器,则不会将其编码到应用程序中,因此工作因素会再次增加。 MITM 攻击可用于查看传输中的密钥并固定证书,使用当前的 https 最佳实践可以缓解此攻击向量。

最后,解密时密钥在 RAM 内存中,可以找到,但再次增加了工作因子。

一般来说,在最高级别保护数据所必需的内容很复杂,需要特殊的硬件和物理安全性。

底线:确定您要防御的攻击者级别和数据的价值;代码到那个级别。不要小看攻击者。

【讨论】:

  • 如果您需要在用户下载应用程序时设置密钥,那么您必须将其硬编码到代码中(*.m 文件),然后将其保存到钥匙串中。二进制不能被反编译和读取吗?我想没有万无一失的方法,除非客户端从服务器请求密钥,然后将其直接存储在钥匙串中
  • @SamB 请参阅此SO answer 的更新以获取更多信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-24
  • 2010-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多