1

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

对 Android 和 iOS 的构建进行逆向工程并提取硬编码值有多容易?

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

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

你觉得我的想法怎么样,你会推荐什么?

4

7 回答 7

1

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

  1. 静态分析:使用 IDA Pro 等静态分析工具可以揭示有关二进制文件的大量信息。同样,标准的 *NIX 命令strings显示二进制文件中包含的每个字符串。

  2. 运行时分析和调试:GDB 等工具可以在运行时显示应用程序的内部结构,允许用户设置断点、读/写寄存器和数据位置,以及在程序中进行挖掘。

  3. 网络代理:只需在系统设置应用程序中为连接到同一本地网络的笔记本电脑指定网络代理,笔记本电脑就可以查看设备发送到服务器和从服务器接收的所有内容。除非此数据在发送之前或接收之后被加密,否则用户将能够确定密钥是什么。

要记住的主要一点是:无论您如何尝试向用户隐藏密钥,只要有足够的时间和精力,他们都将能够弄清楚。

于 2012-05-07T22:34:42.823 回答
1

您的设计中有许多安全漏洞。说真的,只需将 SSL 与基本身份验证一起使用。它经过实战测试,对于您描述的用例来说绰绰有余。

于 2012-04-24T05:35:09.393 回答
1

通常,如果您必须询问有关在生产代码中设计自己的加密方案的问题,您不应该在生产代码中设计自己的加密方案(并且您永远不应该将一次性密码硬编码到应用程序中,因为这意味着它是多次使用)。

两因素身份验证很好,但您使用的实际加密应该是众所周知的。如果您希望将某种密钥嵌入到应用程序中,您可能需要研究公钥加密方案,例如RSA像SSL这样的加密套件可能是在这里使用的合适系统。

于 2012-04-24T05:35:35.843 回答
0

如果它只是以纯文本形式留在二进制文件中,则很容易从应用程序中提取加密密钥。您需要将密钥隐藏在代码中或另一个文件中。

例如,如果将字符串隐藏在代码中,而不是仅仅做类似@“我的密钥”之类的操作,而是使用一些非标准方式构建字符串,可能存储 10 个字符串,并从每个字符串中选择一个字母,将它们连接在一起形成您的实际密钥。

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

于 2012-04-24T05:39:48.090 回答
0

这是一个高级建议:

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
于 2015-01-08T15:45:51.053 回答
0

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

但是,我不太确定您对每个人的单键策略。您是否可以使用用户名和密码(或 SMS 身份验证)对用户进行身份验证,然后为他们生成唯一的用户密钥。您可以将此密钥存储在钥匙串中以供将来参考。

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

于 2012-04-24T05:47:35.660 回答
0

对 Android 和 iOS 的构建进行逆向工程并提取硬编码值有多容易?

很容易。

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

对用户来说过于复杂,仅在确实需要时才使用(对于安全要求高的应用程序)

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

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

于 2012-04-24T05:34:49.177 回答