所以我的服务器和客户端之间有这个TCP连接,任何人都可以连接到我的服务器 . 但我想确保客户端真正使用我的客户端应用程序,而不仅仅是伪造来自虚假TCP客户端的消息 . 如何做到这一点,检查连接是否真的来自我的游戏客户端?
谢谢!
EDIT 如果我要使用TLS,我可以解决这个问题吗?
您可以使用公钥/私钥对来验证您是否是您所说的人 .
http://en.wikipedia.org/wiki/RSA#Signing_messages
我的默认响应是使用质询/响应身份验证 .
连接后,从服务器向客户端发送一个随机数然后,客户端使用散列/密钥/ ....计算响应消息并将其返回给服务器
如果响应与服务器计算匹配,则您的真实性机会更好 . 请注意,您的客户的逆向工程师会将此方法置于欺诈之下 .
可能没有完整的解决方案来解决您的问题,因为无论您做什么,另一方可能总是接受您的程序,在受监控的环境中运行它,操纵运行时数据并让它使用其“安全”网络协议 . 由于客户端应用程序无法控制,您永远无法确定它是您自己的程序 .
宝贝示例:我的应用程序运行您的应用程序并将数据回放到您的服务器,并将您的响应转发回应用程序 . 你怎么知道?
也就是说,使用SSL并将客户端的私钥硬编码到应用程序中可能是一种非常有前景的方法 - 您可以尝试使用一些技巧并使其难以找到(例如,查看Skype如何执行) . 如果你还在你的程序中构建了完整性检查,以确定是否有人在操作内存或调试你的程序,你可以试着让潜在的对手更难一点 . (但请注意,您将始终必须将私钥与您的应用程序一起发送,因此发现它并非真正安全 . )
其他人已经建议你的问题有用的答案,但我会建议另一种方法 . 重新检查您的要求 .
问问自己为什么要了解客户端程序的身份 . 是否可以信任您的客户端程序而不是信任第三方客户端程序?
如果您需要信任已经发送给客户的软件的身份或完整性,我声称您的安全模型已损坏 . 一旦软件在客户端的PC上运行,即使您最初编写它,也应该认为它是邪恶的 .
任何状态,任何命令,来自网络的任何数据都必须在依赖之前进行检查 .
4 回答
您可以使用公钥/私钥对来验证您是否是您所说的人 .
http://en.wikipedia.org/wiki/RSA#Signing_messages
我的默认响应是使用质询/响应身份验证 .
连接后,从服务器向客户端发送一个随机数
然后,客户端使用散列/密钥/ ....计算响应消息并将其返回给服务器
如果响应与服务器计算匹配,则您的真实性机会更好 . 请注意,您的客户的逆向工程师会将此方法置于欺诈之下 .
可能没有完整的解决方案来解决您的问题,因为无论您做什么,另一方可能总是接受您的程序,在受监控的环境中运行它,操纵运行时数据并让它使用其“安全”网络协议 . 由于客户端应用程序无法控制,您永远无法确定它是您自己的程序 .
宝贝示例:我的应用程序运行您的应用程序并将数据回放到您的服务器,并将您的响应转发回应用程序 . 你怎么知道?
也就是说,使用SSL并将客户端的私钥硬编码到应用程序中可能是一种非常有前景的方法 - 您可以尝试使用一些技巧并使其难以找到(例如,查看Skype如何执行) . 如果你还在你的程序中构建了完整性检查,以确定是否有人在操作内存或调试你的程序,你可以试着让潜在的对手更难一点 . (但请注意,您将始终必须将私钥与您的应用程序一起发送,因此发现它并非真正安全 . )
其他人已经建议你的问题有用的答案,但我会建议另一种方法 . 重新检查您的要求 .
问问自己为什么要了解客户端程序的身份 . 是否可以信任您的客户端程序而不是信任第三方客户端程序?
如果您需要信任已经发送给客户的软件的身份或完整性,我声称您的安全模型已损坏 . 一旦软件在客户端的PC上运行,即使您最初编写它,也应该认为它是邪恶的 .
任何状态,任何命令,来自网络的任何数据都必须在依赖之前进行检查 .