我的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;
}
思想?
答案 0 :(得分:1)
Bad idea。原因与hard-coded passwords相同。您可以从多个位置对最终密码进行模糊处理和异或,但是有能力的黑客将监视设备的内存并以足够的时间对任何聪明的协议进行反向工程。如果他只是窃取手机,他就有。或者可以安装侧通道攻击并测量执行时间或功耗,因此像电影中的安全设备一样猜测关键 - 如果它们更接近目标,则可以一点一点地摆弄键和“听”。
所以你可以更难,但没有硬件支持的安全存储机制(这将保护内存访问和模糊功耗,执行时间等很像智能卡或硬件安全模块),没有机会做到这一点安全
密码需要以保留带外信息,与设备分开。理想情况下,用户每次需要时都会输入它。当然,从用户的角度来看,这是乏味的 - 但至少它是安全的。
答案 1 :(得分:0)
一种可能的方法是使用两个或三个字节的数组,例如key[i] = ary1[i] ^ ary2[i] ^ ary3[i]
。您应该在三个不同的位置初始化它们。你不必在相同的循环中进行异或,两个可以先进行异或,然后进行第三次。这取决于你想为任何攻击者制作它有多尴尬。
它不会完全安全,但它会阻止一个偶然的攻击者。对于一个非偶然的攻击者,你需要一个加密专家,我不是。您可以为顾问支付多少费用取决于数据被盗时的费用。
哦,从不拨打你的密钥key[]
,这只是在惹麻烦。 :)