我有以下场景:客户端通过tcp连接到服务器。客户端将其凭据发送到服务器(密码,用户名,mac地址)。如果数据正确,服务器将验证凭据并处理客户端。
但这是对的吗?我想确保只有一个(在注册的用户配置文件中)计算机可以使用此客户端。这意味着必须识别客户端和计算机。我确定上面的建议是非常错误的。但我怎么能做得更好呢?
答案 0 :(得分:1)
这是一个棘手的问题,正如评论指出的那样,用户可能伪造任何机器信息以伪装成另一台计算机。
我建议您对机器信息进行哈希处理(例如使用SHA-256),这样就不会立即显示用于识别计算机的信息。当然,攻击者可以通过多种方式(监控,反汇编等)来学习这一点。
Here是关于可用于唯一标识计算机的数据的一些提示。我会选择几个特征,将它们放在一起然后散列它们。这当然意味着如果用户改变,例如他的硬盘(你使用它的串口识别电脑),然后他再也无法连接了。我想你需要提供一个"重新创建密钥"用户无论如何都要切换或修改他们的计算机。
这种方法通过使用多条信息并对其进行散列来欺骗您的系统变得更加困难,迫使用户a)弄清楚您使用的信息和b)如何散列它(绝对使用盐)。 但是,仍然很可能做到这一点。现在的问题是:你的要求有多高?一个典型的用户无法绕过这个,如果你想要的话就足够了。
我不确定是否有一个完美的"解决此问题的方法,因为您希望保护您的系统免受您的用户的影响。这意味着所有加密密钥,证书或您使用的任何内容都是用户已知的并且可供用户使用。最重要的是,用户可以访问您的客户端应用程序并进行分析。他们可以用你无法预防的方式修改他们的计算机。总而言之,我认为你所做的最好的事情就是让背后的一个巨大的痛苦绕过你的守卫,以至于没有人愿意为此烦恼/你可以减少可能这样做的用户数量。
我唯一能想到的就是在您的服务器上进行奇特的日志记录和监控,例如:检测用户与他的一台机器多次连接,然后提醒您或中止除一个连接之外的所有连接。同样,这只能减少滥用,但不能完全阻止它。