2

这是一个消息传递应用程序。它没有登录名(用户名或密码)。这意味着它必须向服务器发送消息,并且服务器必须相信它来自它说它来自的电话号码。

你是怎样做的?

1) 通过短信服务向手机发送令牌

4

2 回答 2

6

不幸的是,您无法 100% 保证向服务器报告的电话号码就是它的来源。原因是客户端代码可以被逆向工程,不管你做什么。但是,您可以做一些事情来让它变得更困难一些,尽管重要的是您不要依赖它来保证 100% 的安全。如果您需要 100% 的保证,那么您需要让应用通过传统方式向服务器进行身份验证。

我这样做的方式是在每个被释放的客户端副本中嵌入一个令牌,这样每个客户端都有一个不同的令牌。令牌应该具有极大的熵(例如 128 位或更大的整数),并且您应该在服务器上保留您已发布的令牌列表以及设备的电话号码,以便您检查它们的有效性。要求重新安装应用程序以使用新令牌,并将以前的令牌列入黑名单,使其无法再使用。可以使用 UID,但请注意,它很容易被 root 设备欺骗。

每次将此令牌提交给服务器,并确保该应用声称从未更改过的电话号码。为了让逆向工程师更难在您的代码中找到令牌,您可以xor使用额外的令牌一次或多次,您还可以在整个代码中布置一堆虚假令牌,这些令牌在服务器上被列入黑名单。

您还可以使用从服务器检索的密钥对其进行加密,以便在与服务器进行实时交互期间必须由 RE 检索嵌入式令牌。同样,这决不能保证令牌不会被发现和更改/被盗,但它提高了潜在逆向工程师的门槛。

为了防止有人嗅探电线并获取和/或篡改您的令牌,或使用Burp Suite之类的代理来捕获/篡改它,您应该使用加密的 HMAC。如果您以前从未使用过 HMAC,请注意,除非您对其进行加密,否则它仅提供身份验证和完整性,而不提供机密性

编辑:

还应该补充一点,您应该在部署代码之前通过混淆器运行代码。这不会混淆令牌,但它会混淆反编译的代码,因此它看起来像 RE 的胡言乱语。这迫使 RE 使用您应用程序中的字节码/汇编代码,这要困难得多。

于 2013-06-18T23:17:01.753 回答
1
  1. 将每个电话号码与唯一的设备标识符相关联
  2. 获取 udid 并随每个请求一起发送
  3. 在对服务器的每个请求之后创建一个签名。签名应该类似于:secret key1+msg+phone number+udid+secret key2,然后 SHA1 字符串并附加到请求。
  4. 在服务器上计算签名并与消息后面的原始文件进行比较。如果他们匹配,好的,否则不要发送。

使用强键,并使用两个,几乎不可能进行暴力提取。

于 2013-06-18T23:14:20.503 回答