保护基于节俭的通信
Posted
技术标签:
【中文标题】保护基于节俭的通信【英文标题】:Securing thrift based Communication 【发布时间】:2014-08-07 19:18:13 【问题描述】:所以,我用客户端和服务器制作了一个基于节俭的程序,客户端可以与服务器进行良好的通信。现在,由于数据传输非常重要,我希望它具有某种安全性。
所以,我想到了登录系统,但问题是我没有在服务器端存储任何类型的会话数据(我什至不知道,我应该存储什么,毕竟客户端请求来来去去。无法区分它们)。想了很久,终于想到了这个
-
使用随机数,我会在服务器启动时生成某种随机字符串
客户端将输入用户名和密码,这将在服务器端使用 PAM 身份验证进行验证(只需阅读相关内容)。
如果验证通过,服务器只会将随机生成的字符串发送到客户端
客户端每次尝试执行 RPC 时都会将该字符串发送到服务器
如果验证通过,服务器将执行该工作,否则返回一些错误代码
我能想到的可能问题
目前,当服务器宕机,客户端正在进行一些 RPC 时,它会给出一些错误消息,当服务器重新启动时,我们可以毫无问题地完成任务
现在,如果服务器宕机,那么生成的字符串会有所不同。所以我将再次进行身份验证部分
那么,您如何看待整个身份验证架构?有没有更好或更简单的方法?
P.S:我没有使用任何类型的数据库。我在两边都使用 C++。我的客户端使用 QT
【问题讨论】:
"现在,如果服务器出现故障,那么生成的字符串将不同。所以我将再次进行身份验证部分" - 当然,如果服务器再也不会出现,您将不得不寻找另一台服务器。问题出在哪里? 重新认证整个事情会使事情变得复杂。再加上我试图采用的东西是否可以被认为是好的。然而,SSL 似乎是一个很好地集成在 thrift 中的解决方案。所以最好使用它,而不是重新发明整个***:) 看看我的回答ssl-certificate-not-authenticating-via-thrift-but-ok-via-browser,它详细说明如何为 Thrift 设置 SSL 相互身份验证。 【参考方案1】:免责声明 - 我对 PAM 的工作原理不太了解,所以我对这种方法只有一些高级别的问题。如果我误解了您的方法的任何部分,我提前道歉。
当您说要保护数据传输时,我觉得您想要进行身份验证和保密,您现在只有一种身份验证方法。
例如,如果客户端 C1 正在向服务器进行身份验证(假设凭据不是以明文形式发送的),服务器会在步骤 3 中发送随机字符串。当其他人在网络上进行嗅探时会发生什么?流氓客户端可以不发送随机字符串并对服务器执行 RPC 调用,冒充 C1 吗?如果用户名和密码以明文形式发送到服务器,网络上的其他人也可以访问凭据吗?另外,随后发送的数据呢?它只是以节俭格式编码,可以被网络上的任何人解码,对吗?数据是否敏感?
如果是这样,我想建议使用 PKI/证书。使用自签名证书一定没问题。如果您只希望客户端向服务器进行身份验证并证明它是合法的,您可以让所有客户端都出示他们的证书。证书基本上是该客户端的公钥,由为该客户端担保的机构签署。客户端将私钥存储在本地,永远不会离开客户端。现在,当客户端向服务器提供证书时,服务器会查看谁签署了证书(CA)。如果它是服务器信任的 CA,它可以直接发送随机字符串或仅发送节俭数据,使用客户端的公钥加密。客户端将能够使用其私钥解密,并且对于正在嗅探的任何其他人来说,它看起来都是随机字节。服务器将为每个客户端执行此操作,并且只需要存储它信任的认证机构的名称。这可能是您的姓名和地址。您可以使用 openssl 在每个客户端上生成自签名证书。但这意味着您在每个客户端上都有额外的设置工作。生成密钥对和证书。如果此约束对您有用,您可以探索此方法。
【讨论】:
好吧,我确实想到了 ssl,但我认为设置可能会使整个过程变得困难,而且它只对服务器进行身份验证的想法......这就是为什么我放弃它并想到像网站通过检查用户的用户名和密码来对用户进行操作。根据您的建议,我确实到处查找,发现 thrift 实际上提供 SSL,甚至进行客户端身份验证。我遇到了这个及其很好的解释***.com/questions/10964755/…顺便说一句谢谢:)以上是关于保护基于节俭的通信的主要内容,如果未能解决你的问题,请参考以下文章
基于事件驱动架构构建微服务第19部分:使用 SignalR 和 Azure Active Directory 构建和保护实时通信...