【问题标题】:Dynamically generating a decryption key rather than hardcoding a string literal? (Objective-C / iPhone)动态生成解密密钥而不是硬编码字符串文字? (Objective-C / iPhone)
【发布时间】:2011-08-21 21:55:09
【问题描述】:

我的 iPhone 应用正在使用加密资产。解密密钥需要硬编码,但我试图避免使用字符串文字。有没有一个好的标准算法来做这种事情?

假设我的密钥是:

abcdef01-2345-6789-abcd-ef0123456789

而不是这样做:

NSString *key = @"abcdef01-2345-6789-abcd-ef0123456789";

我宁愿做这样的事情:

-(NSString *)key {

    //TODO: generate abcdef01-2345-6789-abcd-ef0123456789 dynamically

    return generatedKey;
}

想法?

【问题讨论】:

  • 有很多方法可以做这样的事情,但如果不是全部,大多数方法最好描述为混淆而不是加密,即使混淆技术涉及密码学。为了更好地回答您的问题,也许您可​​以描述此密钥的生命周期、它的使用方式以及您试图用它来保护或防御什么。
  • 如何阻止攻击者自己调用-[object key]

标签: iphone ios key encryption


【解决方案1】:

Bad idea。原因与hard-coded passwords 相同。您可以从多个地方对最终密码进行混淆和异或处理,但有能力的黑客会监控设备的内存,并在足够的时间内对任何巧妙的协议进行逆向工程。如果他只是偷了电话,他就有了。或者可以安装边信道攻击并测量执行时间或功耗,因此猜测密钥就像电影中的保险箱破解者一样 - 一点一点地摆弄密钥并“倾听”它们是否更接近他们的目标。

所以你可以让它变得更难,但如果没有硬件支持的安全存储机制(可以保护内存访问并混淆功耗、执行时间等,就像智能​​卡或硬件安全模块所做的那样),就没有机会做到这一点安全。

密码需要保留带外信息,与设备分开。理想情况下,用户会在每次需要时输入它。从用户的角度来看,这当然很乏味 - 但至少它是安全的。

【讨论】:

    【解决方案2】:

    一种可能的方法是使用两个或三个字节数组,例如key[i] = ary1[i] ^ ary2[i] ^ ary3[i]。您应该在三个不同的地方初始化它们。您也不必在同一个循环中进行异或,可以先异或两个,然后再异或第三个。这取决于您想让攻击者感到多么尴尬。

    它不会完全安全,但它会阻止临时攻击者。对于非临时攻击者,您将需要一位加密专家,而我不是。您可以为顾问支付多少费用将取决于如果数据被盗,您将花费多少。

    哦,并且永远不要拨打您的密钥key[],那只是自找麻烦。 :)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-27
      • 2016-03-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多