使用时间戳生成令牌的安全性如何?

时间:2015-04-14 08:52:10

标签: php android web-services security

我们有一个Android应用程序,它将一些数据发送到Web服务,然后Web服务将其保存在MySQL数据库中。我们希望避免使用Web服务的用户,如果它不是来自应用程序本身。我的意思是,我们希望确保没有人可以对我们的应用程序执行MITM攻击,然后将来自其他地方的请求发送到我们的Web服务。

我们提出了下一个想法:

我们在Android应用程序和Web服务上都包含一个密码,然后每次向Web服务请求使用这样的密码短语和当前时间戳以这种方式生成:

// Pseudo
String token = md5(private_passphrase + (timestamp / 60));

然后将生成的令牌发送到Web服务,该服务以相同的方式生成另一个令牌并进行比较。如果两者相同,则允许请求。

这个想法是,即使有人嗅到从我们的应用程序发送的数据包,他们也不能在以后从其他来源使用相同的请求。

这个解决方案的安全性如何?我们更关心的是不让别人在应用程序外部使用我们的服务,而不是保护我们发送的数据。

2 个答案:

答案 0 :(得分:2)

我会问你的问题是你试图防范的特定攻击媒介:

  1. 基于网络的漏洞利用

    这不能防止攻击者发出虚假请求。他们只需要拦截1个请求,然后他们将有60秒(好,平均30个)使用相同的令牌发出请求。

  2. 长期基于网络的漏洞利用

    这样可以防止攻击者长期发出虚假请求。由于生成的令牌很快就会失效,攻击者需要为他们想要发送的每个请求时段获取一个令牌。

  3. 通用保护

    这不能防止通用攻击。如果您将私人密码存储在应用的APK中,则攻击者可以对APK进行逆向工程以获取密码,从而生成他们想要的任何有效令牌。游戏结束。

  4. 更好的方式

    由于您明确说出了#34; MITM",我建议您使用TLS(HTTPS)进行所有通信。实际上,您可以在应用中使用certificate pinning,以确保您正确连接到服务器。

    您永远无法确定请求来自您的应用。因此,您只需要能够标记滥用用户。 This answer提出了一种很好的方法。

    但是,请确保将所有流量的HTTPS用作基线,否则任何"保护"你尝试在顶层放置根本就不会起作用。

答案 1 :(得分:0)

那么,根据你如何生成你的时间戳,除以60将不一定能给你你想要的东西。我想你想得到某种“分钟窗口”。时间戳通常以毫秒为单位,这意味着您需要除以60000。

如果攻击者发现了这一点,实际上并不像你希望的那么难,这很容易被欺骗。

此外,如果两侧的时钟都关闭了一分钟以上,系统会将此视为无效的访问尝试,并拒绝访问。这也适用于时区更改,当您的某个客户突然切换时区时,无论出于何种原因,可能是商务旅行。

有许多一次性填充算法和库,可以在不涉及时间戳的情况下解决这个问题,只需使用谷歌搜索“一次性填充”。