如何在iOS应用程序中存储关键敏感信息,如secret,key,token,encryptionKey

Raj*_*shu 25 iphone data-security ios app-secret

当我们谈论保护iOS应用程序时,我们经常忘记保护最关键的敏感信息,如secret,key,token,encryptionKey.此信息存储在iOS二进制文件中.因此,您的服务器端安全协议都不会对您有所帮助.

有很多建议我们不应该将这些信息存储在应用程序中,而是存储在服务器中并通过SSL安全的Web服务调用获取.但这对所有应用都不可能.例如,如果我的应用程序根本不需要Web服务.

在iOS应用程序中,我们有以下选项来存储信息.

  1. UserDefault:不适合这种情况
  2. 字符串常量:不适合这种情况.可以通过逆向工程来检索或只使用字符串命令
  3. 安全数据库:存储在安全和加密的数据库中.但又有责任保护数据库用户名和密码.
  4. KeyChain:最适合存储关键信息.但是在安装应用程序之前我们无法保存信息.要存储在钥匙串中,我们首先需要打开应用程序,从某些来源读取并存储在钥匙串中.也不适合我们的情况.
  5. 自定义哈希字符串常量:不直接使用来自服务提供商(mixpanel,paypal)的密钥,令牌,密钥,而是使用来自自定义密钥的该信息的哈希版本.这也不是完美的解决方案.但在黑客攻击期间增加了复杂性

请发送一些很好的解决方案来解决这个问题.

Mic*_*iec 21

如果您不想使用自己的后端,请使用Apple.您可以配置随需应变资源并使用您的密钥,令牌,Apple服务器上的任何密钥保存数据文件.首次下载后,您可以将此数据写入Keychain,这足够安全.我猜测iOS和Apple服务器之间的联网也足够安全.

按需资源要点

访问和下载按需资源


Lep*_*ron 5

1)需要Internet连接

1.1)推送通知 进行安全数据交换的好方法可能是使用Apple的(静默)推送服务,那些使用apns并通过https发送数据 - 更多详情3.1

1.2) 当向已经部署的应用程序分发新用户证书时,如果重新安装应用程序没有机会且应用程序需要有效的互联网连接,也会使用或多或少类似的方法.

缺点:需要工作网络连接,基本上信息来到应用程序,当它已经被执行=>似乎不适合您的情况.(见第4步)

2)静态数据(因为没有网络连接/通信伙伴就没有交换)

使用私有密钥在数据包本身中提供数据加密.无论它现在是字符串还是哈希,都可以使用您在应用程序中嵌入的函数进行逆向工程.从iOS9开始,反编译iOS应用程序非常困难,基本上你将主要查看提供的头文件.所以如果你有这样的函数,字符串,哈希值或其他什么,请确保你在.m文件中得到它!

但同样重要的是:如果信息不是设备或用户特定的,只是您自己的微环境中的一个秘密,在所有设备上都有效,如果没有更新过程,您必须在同一个捆绑包中提供加密数据和解密方法/信息交换或其他东西,你可以想到.

适用于加密:iOS System.Security https://developer.apple.com/reference/security 或只是openssl

您描述的钥匙串方法之间的区别在于:您获得了一个值,该值将被加密并安全存储.(2)描述了具有加密和存储(捆绑)半安全值的方法,该值将被解密

3)信息交流

您描述了由另一个实例进行哈希处理的关键数据.大! - 确保,相当确定,您正在与之交谈的实例实际上是您期望的实例(使用ssl证书固定等网络挂钩预防,但即使在这里您也可能有入侵者(中间人)).您可能(可能)在您的应用程序包中提供了一个证书,以确保通信服务器的真实性 - 在这里您再次使用,这些数据应该确保您的微环境的某些实例之间的安全过程.尽管如此,这些数据仍在您的应用程序包中提供.

3.1安全信息交换扩展 - 无声推送 利用Apple的服务器为此交换您的秘密.如果您只需要交换小数据块.我建议对用户使用静默推送通知,这些通知甚至可以在没有用户明确许可的情况下工作.巨大的优势:如果您的秘密或密钥发生变化,您可以尽快通知用户有关更改的信息.当他们收到新数据时,他们可能只需要更改,这在大多数情况下应该可靠地工作.例外:在本地网络中或通过蓝牙进行数据交换,在这种情况下,我建议向用户提供通知,要求更新本地解密密钥.或者以这种格式交换密钥.再一次:我正在泄漏有关您的环境架构的一些详细信息.缺点:你不知道,用户是否只是第一次使用你的应用程序,直到用户"告诉"你. https://developer.apple.com/library/content/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/APNSOverview.html#//apple_ref/doc/uid/TP40008194-CH8-SW1

3.1安全信息交换扩展 - 在应用 程序购买中为用户使用应用程序内购买以获取数据到手机.这里好点:您可以轻松提供更大的数据块,因为这应该是用户的主动请求,用户确实期望某些处理时间,并且还应该知道需要有效的互联网连接的事实.缺点:用户必须故意选择此项.在此之前,应用程序无法正常工作. https://developer.apple.com/library/content/documentation/NetworkingInternet/Conceptual/StoreKitGuide/Introduction.html#//apple_ref/doc/uid/TP40008267

因此,它与基本思想中的方法(2)略有不同.

简而言之:您能否提供其他信息,加密/想要安全存储所需的数据类型以及是否进行网络交换?

这里需要更多信息:-)

我想再次强调iOS上的应用程序不再那么容易解密,即使反编译也不会得到所有东西,你期望得到它.例如,像dumpdecrypt这样的解密工具只能在iOS 8.4之前正常工作


der*_*ito 5

在我看来,最好的方法是使用内置的CloudKit。您可以将您的机密保存在CloudKit 仪表板中,然后在启动时获取它们。由于 CloudKit 只是一个传输层,您必须将应用程序机密存储在 KeyChain 中。

我知道您提到 KeyChain 不适合您的用例(不知道为什么),但这是不将机密包含在您的应用程序中的好方法。您无法绕过从其他来源获取应用程序机密。

CloudKit 访问使用系统 iCloud 帐户进行保护,如果没有 iCloud 帐户,您仍然可以安全地访问 iCloud 服务器。另一个额外的好处是您可以随时更改您的应用程序机密,因此如果您想更加安全,您可以实施轮换计划。

了解有关 CloudKit 的更多信息


归档时间:

查看次数:

3304 次

最近记录:

7 年,6 月 前