首先,对于提出新手安全问题,我表示诚挚的歉意。这是我在网络安全领域的第一次真正的尝试,我有点迷失。
我正在开发Android应用程序和随附网站,这两个网站都要求用户登录才能使用我的网络服务器提供的服务。这些服务都是以无会话的方式编写的,这意味着经过身份验证的请求(请求用户凭据的请求)都需要提供其附带的安全令牌才能运行,并且每个经过身份验证的请求首先必须验证用户的凭据。
我如何开发这样的架构是让用户使用电子邮件和密码登录。此信息通过SSL发送到身份验证服务器,并提供身份验证令牌(密码哈希的独立哈希)。然后将此令牌存储在客户端上(用于网站的cookie和android中的私有共享首选项)。对于将来的所有呼叫,除非用户注销,否则此令牌有效并可用于对用户进行身份验证。每个设备(不同的Android设备或Web客户端)也获得自己的独立令牌,以便身份验证令牌是一对散列令牌+设备ID。
此外,我想避免在每个经过身份验证的呼叫中使用SSL。理想情况下,我希望只对初始身份验证(使用电子邮件/密码)进行加密,并使用用户登录时获得的身份验证令牌通过HTTP进行其余调用。我避免这种情况的原因是三次握手成本以及维持持久或长期连接不是首选。
不使用SSL但让我对中间人攻击(MIM)持开放态度。如果有人拦截了这些呼叫并获得了[设备ID +认证令牌],那么无论出于何种目的,他们都可以冒充用户并访问用户可以访问的所有内容,直到用户退出为止。指向令牌将失效。
我知道我的实现并没有处理MIM攻击,所以我想知道你是否可以建议另一种方法来实现这一点,它不会为每个呼叫都包含SSL,但却避免了MIM攻击。
简而言之,我的要求是:
是否可以将所有这四项要求放在一起?我可以避免使用SSL连接并仍然维护安全的无会话服务器吗?我的实施在哪里出错?如何避免MIM攻击的问题?
如果这是重复的话,请提前多多感谢并道歉。我无法在任何地方找到答案。也许我在寻找错误的东西。如果是的话,请告诉我,我会关闭/删除这个问题。
答案 0 :(得分:-1)
SSL在OSI会话层保持状态,并使用共享密钥加密整个消息。如果你想要一个廉价的解决方案来阻止MIM并且没有服务器状态,我能想到的唯一(低安全性)解决方案是使用服务器范围的全局秘密并在初始SSL过程中将其发送到客户端。以下HTTP往返将使用此共享密钥加密请求/响应 但它只是一个执行得很糟糕的SSL,应用程序级加密/解密过程可能比内置SSL更昂贵。而你无法加密标题!