我有一个一般性的安全问题:
假设有一个通过登录和密码授权的客户机服务器应用程序,使用服务器和客户端之间的安全连接(https)。用户可以拥有不同的权限,允许用户访问服务器提供的不同类型的信息。这只是服务器功能的一部分。但它会造成很大的交通负荷。
所以我想介绍另一种服务器(信息服务器),除了主服务器之外,它只提供信息用途。这应该是尽可能简单,所以我不想介绍任何类型的互动之间的主机和信息服务器通过网络。
那么,我现在看到了什么解决方案(客户机和服务器之间的所有连接都是安全的):
我不确定这种方法是否安全。有什么漏洞吗?如果我使用令牌授权,我应该选择哪种加密方式?
我很感谢你的帮助。谢谢!
发布于 2014-01-21 12:15:58
这不是你需要的加密。嗯,你可能也需要它,但这并不能完成全部工作。
加密是为了保密:如果您不希望客户端了解令牌内容,即他的权限,则对令牌进行加密。也许你确实想向客户隐瞒这些信息,但这是次要的问题。您希望实现的主要安全特性是完整性:您不希望客户端能够生成假令牌并被授予入口。一般来说,加密并不提供完整性;为此,您需要一个MAC或数字签名。作为一种副产品,加密可能会使数据更改变得更加困难,但肯定不是不可能的。
数字签名更通用,但更重(更大的大小和CPU开销)。数字签名提供的内容如下:验证签名的人不需要生成其他签名;验证和生成权限是不相交的。对于MAC,使用相同的密钥来产生MAC并对其进行验证,因此这两种功率是等价的。在您的示例中,可能没有必要使用exta泛型签名,因为这两台服务器都是您的,因此您可能可以在两台服务器之间安排共享密钥。但是,您可能希望使用一个签名,以便攻击者获得数据服务器的只读一瞥(例如通过旧的废弃硬盘)无法获得足够的信息来伪造令牌,从而获得系统中所有可能的用户的所有写入访问权限。
如果您遵循共享密钥的简单方式,并且希望同时使用加密和MAC,那么就会鼓励您使用“加密模式”来提供两者,因为几十年的研究已经得出结论,将加密和MAC混合在一起是一项复杂的工作,容易发生灾难性的沉默失败。所以使用GCM或EAX。
如果您想要签名和加密,那么这也不是一项轻松的工作。一个额外的复杂因素是解密的能力必须在数据服务器端,而签名生成则在信息服务器上。在这个模型中,两个服务器都有自己的密钥对。明智的做法是使用现有的格式和库来处理棘手的问题。我建议使用OpenPGP;它是一种经过仔细研究的格式,并且有开放源代码实现(例如,在许多框架中都有绑定的GnuPG )。
不管模型和实现如何,两个服务器之间缺乏直接通信必然会给客户端一些额外的权力:邪恶的客户端可能决定发送令牌,或者不发送令牌,或者发送另一个令牌。重放攻击就是一个例子:客户机可能希望发送一个旧的令牌值,从而允许他以自那时起就被撤销的特权进入。
阻止重播攻击的一种方法是在令牌中嵌入一个过期日期(当然,在MAC或签名的保护下:邪恶的客户端希望能够修改该日期)。这是可行的,但也意味着固有的延迟:如果您在信息服务器端决定撤销给定用户的特权,那么该用户仍然可以使用他当前的令牌,直到它到期。这可能导致不舒服的情况:紧急停止按钮应该立即工作,而不是“在15分钟内”。
您可能希望将身份验证与授权分开。身份验证是确定客户端的身份;授权是指决定允许某个客户端做什么。login+password过程是身份验证。如果大部分“高流量负载”来自密码处理(例如,因为您应该使用良好的密码散列功能散列密码),那么您可能希望在"info服务器“上卸载身份验证,同时保持对”数据服务器“的授权。在该模型中,令牌将包含“这是Bob",而不是”允许此令牌的持有者读取数据元素1和2“。
有了这样的设置,您仍然有一个即时的、无延迟的方法来阻止不敏感的用户.一个邪恶的用户仍然是他自己,因此他的身份验证令牌可以长期有效;如果用户的密码被窃取,并且您注意到它(几乎总是异步的),您仍然可以选择在数据服务器上阻止该用户,直到危机得到解决。
发布于 2014-01-21 09:52:36
这种方法可以工作;一个值得注意的例子是Facebook照片是如何工作的--有一些单独的照片服务器以与您建议的方式类似的方式传递标记(至少它以前是这样,而不是最近检查的)。我不会在像网上银行这样的高度安全的情况下使用这个。而且,这是一个相当先进的技术,有一些微妙的做好,所以我只推荐给有经验的开发人员。
你的建议有几个具体的问题:
1)虽然对权限数据进行了加密,但可能会对其进行篡改。您需要使用“消息身份验证代码”(,MAC),它也使用私有对称密钥,这样可以防止篡改。事实上,在这一点上,加密是可选的。我可能会使用HMAC-SHA1 1作为MAC算法。
2)易受重放攻击。如果用户的权限被撤销,他们拥有的令牌仍然允许他们访问。解决这个问题的方法是在令牌中包含一个时间戳,并且有一个固定的到期时间--也许是15分钟。
https://security.stackexchange.com/questions/49096
复制相似问题