我应该在我的iOS或Android应用程序中存储一个硬编码的encryption密钥

我计划在服务器和客户端(这是一个移动应用程序)之间的通信使用一次性密码encription。 但是我需要对移动应用程序中的密钥进行硬编码。 因此,不同用户安装的所有移动应用都具有相同的密钥。

在Android和iOS版本上进行逆向工程是多么容易,并且提高硬编码值?

关于我计划的安全性的一些其他信息:我还计划通过向每个用户发送一个带有4位数字的短信来添加额外的安全性,这些数字将用于签名请求。 这样我可以保证用户是谁假装是。

我通过互联网发送用户的位置,他的电话号码(一次),他的名字(一次)。

你怎么看待我的想法,你会推荐什么?

你的devise有很多安全漏洞。 严重的是,只要使用基本authentication的SSL。 这是战斗testing,绰绰有余你所描述的用例。

一般来说,如果你不得不在生产代码中devise你自己的encryptionscheme,你不应该在生产代码中devise你自己的encryptionscheme(你永远不应该把一次性密码写入应用程序,因为这意味着它是被多次使用)。

双因素身份validation是好的,但是您使用的实际encryption应该是相当知名的。 如果您想要在应用程序中embedded某种密钥,则可能需要查看公钥密码系统,如RSA 。 像SSL这样的encryption套件可能是在这里使用的合适的系统。

在Android和iOS版本上进行逆向工程是多么容易,并且提高硬编码值?

好简单。

向每个用户发送一个4位数的短信,用于签署请求

这对用户来说太复杂了,只有在真正需要的时候才能使用(对于安全性要求较高的应用程序)

首先:使用SSLencryption连接(HTTPS)。

例如,您也可以为每个连接从服务器获取密钥和sessionId。 服务器将存储sessionIds和密钥在一些存储…

在iOS上,您可以将钥匙存储在钥匙串中。

但是,我不太清楚你的每个人的战略的唯一的关键。 您是不是可以使用用户名和密码(或者SMSauthentication)对用户进行身份validation,然后为他们生成一个唯一的用户密钥。 您可以将此密钥存储在钥匙串中供将来参考。

并使用安全连接! (HTTPS?)

仅供参考,以不同的方式反向deviseiOS或Android的硬编码值是非常容易的:

  1. 静态分析:使用静态分析工具(如IDA Pro)可以揭示关于二进制的丰富信息。 同样,标准的* NIX命令strings显示了二进制文件中包含的每个string。

  2. 运行时分析和debugging:像GDB这样的工具可以显示应用程序运行的内部情况,允许用户设置断点,读/写寄存器和数据位置,或者在程序中进行挖掘。

  3. networking代理:只要在系统设置应用程序中指定一个networking代理连接到连接到同一本地networking的笔记本电脑,便可让笔记本电脑查看设备发送到服务器的一切信息。 除非这些数据在发送之前或接收之后被encryption,否则用户将能够确定密钥是什么。

要记住的主要是:不pipe你怎样试图隐藏用户的密钥,只要有足够的时间和精力,他们就能搞清楚。

这是一个高层次的build议:

 1) If (keychain is empty) generate a random password, perhaps with base64 encoding If (keychain is not empty) you must have already generated a password from one of your apps, so just use the one in the keychain. 2) If from 1) (keychain is empty) store that new random password in the keychain 

如果只是以纯文本forms保存在二进制文件中,那么从应用程序中提取encryption密钥很容易。 您需要将密钥隐藏在代码中或另一个文件中。

例如,如果将string隐藏在代码中,而不是像@“我的密钥”那样进行操作,可以使用非标准方式构buildstring,也可以存储10个string,然后从每个字符中select一个字母,并将它们连接在一起形成你的真正的关键。

另一种方法是将密钥隐藏在另一个文件中,比如图像。 如果您可以selectencryption密钥,请从您在应用程序中使用的图像中挑选一组特定的字节。