我是否应该在我的iOS或Android应用程序中硬编码存储加密密钥

问题描述:

我计划对服务器和客户端(这是一款移动应用程序)之间的通信使用一次性密码加入。但我需要在移动应用程序中对关键字进行硬编码。因此,不同用户安装的所有移动应用都具有相同的密钥。我是否应该在我的iOS或Android应用程序中硬编码存储加密密钥

对Android和iOS构建进行反向工程并简化硬编码值有多简单?

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

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

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

多么容易反向工程的构建Android和iOS和 extrat硬编码的价值?

很简单。

发送每个用户短信与将用于登录请求

实在是太复杂了用户和一个4位数字,应该只是如果真的有必要(为具有较强的安全应用要求)

首先:使用SSL加密连接(HTTPS)。

另外,您还可以为每个连接从服务器获取密钥和sessionId。服务器会将sessionIds和密钥存储在某个存储中...

您的设计中有许多安全漏洞。严重的是,只需使用基本身份验证的SSL。这是战斗测试和绰绰有余你描述的用例。

一般来说,如果你要问有关在生产代码设计自己的加密方案的问题,你不应该在生产代码设计自己的加密方案(和你应该永远代码一次性密码到一个应用程序,因为这意味着它被用于多次)。

双因素身份验证很好,但您使用的实际加密应该是众所周知的。如果您想要在应用中嵌入某种密钥,您可能需要查看公钥密码系统,如RSA。像SSL这样的加密套件可能是在这里使用的合适系统。

如果它以二进制格式保存在纯文本中,很容易从应用程序中提取加密密钥。您需要将密钥隐藏在代码中或其他文件中。例如,如果将字符串隐藏在代码中,而不是像@ @“我的密钥”那样进行操作,则可以使用某种非标准方式构建字符串,可能会存储10个字符串,然后从每个字符中选择一个字母,将它们连接在一起形成您的实际密钥。

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

+0

为什么downvote?自从问了这个问题已经过去了一年多了,还没有更好的解决方案呢?在某些情况下,您需要在应用中存储公用密钥,此方法可以工作,并且比大多数其他方法更安全。如果你打算陷入低谷,至少会提供更好的解决方案...... – 2013-05-17 16:21:55

+0

我投下了它,因为它没有解决更大的问题:滚动你自己的密码是你能做的最糟糕的事情之一。 – 2013-07-18 23:43:35

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

但是,我不太确定你的每个人的战略的唯一关键。您是不是可以使用用户名和密码(或针对该问题的SMS身份验证)来验证您的用户,并为其生成唯一的用户密钥。您可以将此密钥存储在钥匙串*将来参考。

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

仅供参考,这是非常容易反向工程了从iOS或Android的硬编码值,以不同的方式:

  1. 静态分析:使用静态分析工具,如IDA Pro揭示了关于二进制的丰富信息。同样,标准* NIX命令strings显示了二进制文件中包含的每个字符串。运行时分析和调试:GDB等工具可以显示应用运行时的内部情况,允许用户设置断点,读/写寄存器和数据位置,或者在程序中进行挖掘。

  2. 网络代理:简单地通过指定在系统设置应用程序来挂在同一本地网络膝上型网络代理将允许笔记本,查看该设备发送到和从服务器接收的一切。除非此数据在发送之前或接收之后被加密,否则用户将能够确定密钥是什么。

主要的事情要记住的是:无论你做什么,试图隐藏从用户的关键,只要有足够的时间和精力,他们将能够弄明白。

这里有一个高层次的建议:

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