2015-12-29 205 views
0

我需要在我的应用程序中存储加密密钥,以便它可以使用相同的密钥来加密和上载数据,并从公共商店下载和解密数据。这样,数据不能被任何其他方读取。在iOS应用程序中存储加密密钥?

我担心的是有人劫持我的应用程序的可能性。一旦我的应用程序被存档,是否有人可以阅读应用程序内的硬编码加密密钥?

+0

是的,这是可能的 - 无论您存储在客户端中的任何信息都可能被攻击者读取。 – luk2302

+1

“劫持我的应用程序”是什么意思? – zaph

+0

@ zaph使用越狱设备并浏览我的应用程序的文件?我不知道过程是什么,或者什么是可能的。 – Andrew

回答

0

如果钥匙在应用程序包中有可能被发现,并且这样做并不安全。作为@Cristik状态认证用户到服务器并在那一刻下载密钥。

要保护钥匙,最好的办法是将钥匙保存在钥匙串中。

保护设备所有者非常困难,并且在DRM下更多地受到保护。

防止非所有者取决于所有者设置了好的密码/密码。

防止数据传输(上传/下载)很容易,请使用https,确保服务器是最新的(TLS 1.2和Perfect Forward Secrecy)并将服务器证书固定在应用程序中。

更新:

国际音标仅可执行文件进行加密,这样其他文件可以从下载访问。如果一个文件被加密,攻击者将需要加密密钥,而且可能很强大:随机字节。

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

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

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

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

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

底线:确定您所抵御的攻击者的等级和数据的价值;代码到那个级别。不要低估攻击者。

+0

如果您需要在用户下载应用程序时设置密钥,则必须在代码(* .m文件)中对其进行硬编码,然后将其保存到钥匙串中。不能二进制反编译和读取?我想没有傻瓜证明的方式,除非客户端从服务器请求密钥,然后直接存储在钥匙串 –

+0

@SamB请参阅rthe更新到此[SO回答](http://stackoverflow.com/a/34513262/451475 ) 了解更多信息。 – zaph

1

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

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

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

相关问题