我打算使用一次性密码encription服务器和客户端(这是一个移动应用程序)之间的交际。 但我需要硬编码在移动应用程序的关键。 因此,通过不同的用户安装了所有我的移动应用程序将具有相同的密钥。
多么容易反向工程的构建Android和iOS和extrat硬编码的价值?
有关安全一些其他的信息来源,我计划:我打算也通过发送每个用户短信与将用于登录请求的4位数字,以增加额外的安全性。 这样我可以保证用户是谁假装。
我在互联网上发送用户的位置,他的电话号码(一次),他的名字(一次)。
你觉得我的IDEEA,并且你会recommnd?
您的设计中有许多安全漏洞。 严重的是,只使用SSL与基本身份验证。 这是战斗测试,足以满足你所描述的用例。
一般来说,如果你要问有关在生产代码设计自己的加密方案的问题,你不应该在生产代码设计自己的加密方案(和你永远不应该硬编码的一次性密码到一个应用程序,因为这意味着它是正在使用的一个以上的时间)。
双因素认证是好的,但是你用应该是实际的加密相当著名。 如果你正在寻找嵌入某种到应用程序的关键,你可能想寻找到一个公钥加密方案,例如RSA 。 加密套件像SSL可能是适当的系统用在这里。
仅供参考,这是非常容易反向工程了从iOS或Android的硬编码值,以不同的方式:
静态分析:使用静态分析工具,如IDA Pro的显示了丰富的二进制信息。 同样,标准的* NIX命令strings
显示包含二进制中的每一个字符串。
运行时分析和调试:工具如GDB可以显示一个应用程序的内部,因为它正在运行,允许用户设置断点,读/写寄存器和数据的位置,以及以其他方式在程序周围挖。
网络代理:简单地通过指定在系统设置应用程序来挂在同一本地网络膝上型网络代理将允许笔记本,查看该设备发送到和从服务器接收的一切。 除非该数据被发送之前或加密收到后,用户将能够确定的重点是什么。
要记住的主要事情是这样的:无论你做什么,试图隐藏从用户的关键,只要有足够的时间和精力,他们将能够弄明白。
多么容易反向工程的构建Android和iOS和extrat硬编码的价值?
很容易。
发送每个用户的SMS与将要用于注册请求的4位数字
实在是太复杂了,用户只有是否应该使用它真的有必要(为具有较强的安全性要求的应用)
首先:使用SSL加密连接(HTTPS)。
您也可以,例如,从服务器获取为每个连接键的sessionId。 服务器将sessionIds和密钥存储在一些存储...
在iOS上,你可以存储在钥匙串您的钥匙。
不过,我不太确定你给大家一个战略重点。 是不是你有可能用(为此事或短信认证)用户名和密码,您的用户进行身份验证和susequently为他们生成一个唯一的用户密钥。 你可以存储在钥匙串以供将来参考此键。
并使用安全连接! (HTTPS?)
这里有一个高层次的建议:
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
这很容易,如果它在以纯文本的二进制刚出从应用程序中提取的加密密钥。 你需要隐藏在代码中的关键,或其他文件中。
例如,如果隐藏在代码中的字符串,而不是仅仅做这样的事情@“我的秘密钥匙”,使用一些非标准的方式,也许存储10个字符串,并从每一个接一个字母建串在一起,将它们连接到形成实际的关键。
另一种方式是隐藏另一个文件中的关键,说的形象。 如果你可以选择你的加密密钥,选择一个特定字节集了,你在应用程序中使用的图像。