【问题标题】:Safe way to save encryption keys in iOS在 iOS 中保存加密密钥的安全方法
【发布时间】:2012-05-10 13:33:42
【问题描述】:

在我的 iOS4+ 应用程序中,我在多个地方使用 AES 加密,整个应用程序必须非常安全。为了做到这一点,我必须在这个应用程序中硬编码几个密钥,然后在我需要加密某些东西时随机选择这些密钥......

我的问题是如何存储这些私钥?使用NSString 对它们进行硬编码是否安全?或者

#define SecretKeyString @"febd9a24d8b65c1c787d50a4ed3619a9"

如果用户在安装此应用程序的情况下越狱 iPhone,他不能得到那些硬编码的密钥吗?我怎样才能最有效地隐藏它们?

感谢您的任何建议...

【问题讨论】:

    标签: iphone objective-c ios security encryption


    【解决方案1】:

    其他应用程序所做的是要求用户“登录”才能使用该应用程序。然后,您使用他们的用户 ID/密码作为密钥来加密密钥或使用安全的 Web 服务来获取该用户的密钥。

    如果您使用#define 甚至是 NSString,则有多种方法可以猜测密钥。显然,您必须真正愿意花费大量时间在编译后的代码中找到这些密钥,但根据您正在寻找的安全级别和您要防范的人员,这可能是个问题。

    【讨论】:

    • 好吧,我不能使用登录信息作为密钥,不过会很棒:) 我需要几个静态密钥,这些密钥将被硬编码......但这可能是一个很好的解决方案 - 如果有的话像 5 个密钥一样,其中 4 个将被加密,我必须用第一个密钥解密它们,然后它们才会成为加密的有效密钥......即使在编译中找到这些密钥,也没有人会找到真正的密钥代码...谢谢! :)
    • 如果您对是否可以读取硬编码的密钥感到非常怀疑,那么其中一个选项就是存储转换后的密钥。然后有一种方法将存储的密钥转换回真正的密钥。例如,一个简单的转换将是反向字符串。因此,如果您的密钥是 ABC,您将硬编码 CBA 并在每次要使用密钥时调用 reverse 方法。当然,在真正的应用程序中,你会想要一些比反向更复杂的东西。只是一个额外的想法......
    • 完全正确...这样的事情听起来很可靠...而且我不是偏执狂,我也不认为这是一个大问题,但我必须在工作中这样做,他们很偏执:)再次感谢!
    【解决方案2】:

    我建议阅读一些关于通过混淆来实现安全性的文章,这基本上是您想要实现的目标(至少所有建议都是这么说的),但最终并不安全。

    但是,iOS 的沙盒是您的第一个也是最有效的安全形式。

    其次,输入验证将是您的应用需要的下一个最重要的安全功能。如果您不验证所有输入(从用户输入的信息,到通过方案启动应用程序的网络响应),那么全面加密就没有任何意义。

    最后,安全加密(在必要时)只有在您不进行硬核(或混淆您的硬编码)时才是安全的。 mprivat 是正确的,您需要使用用户生成的数据(登录)、公钥加密(因此只有未包含的私钥可以解密)或使用 SSL 进行传输的服务器端加密。

    我还要说,如果您的安全数据仅在您使用钥匙串 API 的设备上维护,特别是确保您使用要求用户登录以检索项目的表单。

    如果您在设备上加密的数据在设备和另一台设备(如服务器)上都被解密,则您存在基本的架构缺陷。加密解密只能是客户端-客户端(也就是用户的设备)或客户端-服务器(可以是用户设备到服务器或服务器到用户设备),这一点非常重要。将两者混合会导致漏洞。我在这里特别指的是相同的加密机制,对客户端-客户端和客户端-服务器使用单独的加密很好(有时是必要的)。

    对于那些需要编写安全代码的人来说,这是一本必读之书:http://www.amazon.com/gp/aw/d/0735617228

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-13
      • 1970-01-01
      • 2010-09-16
      • 2014-10-18
      • 2015-07-04
      • 2013-08-05
      • 2015-11-24
      相关资源
      最近更新 更多