关于 .NET C/S客户端远程加密与验证,求助!

上帝的亲哥哥 2018-12-21 12:12:35
问题描述:

有时候给客户做的C/S客户端程序,启动时要进行一次时间有效性验证,比如:超2019年1月1日后,软件将不在运行,并友好的提示用户!

已知:
A:每个软件在提供给客户时,已写入了一个固定的SYS_GUID,做为此客户端的唯一标识,也用于将来检测此GUID的远程信息时使用的主Key
B:客户端软件在有万维网环境中,绝对可上网,网络有效性不需要讨论

现在做法:
1、.NET C/S客户端程序已进行混编加密(防反编译)

2、在远程Web服务器上建立一个WebAPI接口,客户端启动时,通过调用API接口,传入SYS_GUID,API接口在数据库中查询SYS_GUID,根据结果,生成可供返回相关信息的JSON,客户端解析JSON,判断出软件的有效性,若已失败,直接提示退出,有效,正常运行。

3、为了访问的终生有效,Web API通过顶级域名进行访问,顶级域名,通过A记录指定固定主机(已测试通讯正常)

问题:

这种方式能否防止别人拦截与破解?或者是否安全及有效,通过WebAPI接口返回验证结果只需要100毫秒左右,这个不是问题。最初想法是想本地查询远程SQL Server数据库,返回结果,这样,数据库的连接在本地,不安全,同时,一旦数据库连接泄漏,就非常危险了。


...全文
1427 27 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
上帝的亲哥哥 2018-12-25
  • 打赏
  • 举报
回复
引用 25 楼 DF-SKy 的回复:
如果全部功能都在本地 验证再怎么牛B 飞上天都没用 OD直接本地绕过破解
如果你的系统核心功能是 远程获取数据 那根本就不用整这些花里胡哨的
一个api验证权限即可

微软office的远程验证,破解工具使用了KMS本地服务,或者修改host方式可骗过远程验证……
上帝的亲哥哥 2018-12-25
  • 打赏
  • 举报
回复
引用 22 楼 足球中国 的回复:
多数都是想多了,有人有那个意思破解你的软件。你应该高兴。

不是没有道理,哈哈
gagadun 2018-12-24
  • 打赏
  • 举报
回复
如果全部功能都在本地 验证再怎么牛B 飞上天都没用 OD直接本地绕过破解 如果你的系统核心功能是 远程获取数据 那根本就不用整这些花里胡哨的 一个api验证权限即可
二十而不悔 2018-12-23
  • 打赏
  • 举报
回复
狼图腾空间
足球中国 2018-12-22
  • 打赏
  • 举报
回复
多数都是想多了,有人有那个意思破解你的软件。你应该高兴。
  • 打赏
  • 举报
回复
既然是服务器——核心的某几个业务功能——控制在你们手里,那么你只要控制注册用户的租用时间就行了,完全没有必要费力气再在客户端写什么代码。
xuzuning 2018-12-21
  • 打赏
  • 举报
回复
SYS_GUID 仅仅是个索引字(甚至还可能只是索引字片段),本不存在安全问题
拦截到也没啥用处,因为既不知道用途,也不知道算法

不过从今天开始,就不大一样了。
因为你公开了 SYS_GUID 的用途,和甄别流程。至少给有意者减少了90%的工作量
X-i-n 2018-12-21
  • 打赏
  • 举报
回复
数据传输有没有加密?用的什么加密方式?如果没有加密的话这套验证没有什么意义,嗅探甚至重放都能绕过去
xuzuning 2018-12-21
  • 打赏
  • 举报
回复
当你把所有破解的方案都研究透了,认为破解的概率很小或代价很大,让人觉得不值得一试时,那你的方案就可认为是可靠的
就好比美国联邦调查局的 MD5,但还是不能保证被快速找到碰撞
xuzuning 2018-12-21
  • 打赏
  • 举报
回复
无论你怎么加密和混淆,那都是在两段内部,软件传出的 SYS_GUID 和将要收到的数据都是一一对应的
长时间监听,还是很容易找到规律的(让两端得以同步的信号,只能是时间)

因为你的问题是:这种方式能否防止别人拦截与破解?或者是否安全及有效
所以我当然是要从如何破解这个方面进行探讨
而不是去证明他是如何如何牢固可靠

不要用 已对称加密,且代码已混编 去阻塞言路
即便是你提供有若干套加密混淆方案,也是要通过 SYS_GUID 提交方案号的,不然也无法针对性的解密返回数据
上帝的亲哥哥 2018-12-21
  • 打赏
  • 举报
回复
引用 18 楼 xuzuning 的回复:
原来是不知道你是如何验证过期的,经你这么一讨论,现在我知道了
如果我想让我手上你的软件不过起的话,只需在过期之前
1、监听网络,截获你的软件访问的域名
2、记录下由该域名返回的数据
3、通过 host 文件将域名定向到自己的服务器
这样软件就永远都会收到有效数据 而不过期了

本来一件很安全的事情,被你这么一解析,就变得毫无安全感了


关键信息,已对称加密,且代码已混编
xuzuning 2018-12-21
  • 打赏
  • 举报
回复
原来是不知道你是如何验证过期的,经你这么一讨论,现在我知道了
如果我想让我手上你的软件不过起的话,只需在过期之前
1、监听网络,截获你的软件访问的域名
2、记录下由该域名返回的数据
3、通过 host 文件将域名定向到自己的服务器
这样软件就永远都会收到有效数据 而不过期了

本来一件很安全的事情,被你这么一解析,就变得毫无安全感了
  • 打赏
  • 举报
回复
防止拦截与破解,根本没有什么可抄袭的东西。 一个系统能做到的是经常更新版本,改变不同技术,而不是什么理论。
  • 打赏
  • 举报
回复
引用 15 楼 zzglxl 的回复:
你想多了,我只是想,软件做完,大家都按合同做事,加个时间戳~~这也是和人提前说明白的,并不是为了损人不利己~~
那可以确定,既要“开放型”又要“判断出软件的有效性”,又要"防止别人拦截与破解",对方其实也是随便想起来个点子就写到合同中。知道通用的采集个信息(比如说c盘某个目录下的某个文件),会上传信息,可能对方觉得非常新奇。对方更多地花时间跟你反复纠结”拦截与破解“这类概念上了。
上帝的亲哥哥 2018-12-21
  • 打赏
  • 举报
回复
引用 14 楼 以专业开发人员为伍 的回复:
既然这么开放,你只要做到经常更新 c 端代码(至少是部分组件代码),就 OK 了。

比如说今天采集用户的 CPU 和主板信息,明天采集用户的 windows 登录账号和密码,后边采集用户电脑上的银行卡账号密码,在以后逐步采集用户的 QQ 通讯录,采集用户的下载文件,采集用户爱看什么片,采集用户喜欢加载什么进程,采集用户爱在什么窗口上移动鼠标.......你随便采集,随时传给你的服务器。

你随时可以搞垮用户业务请求。不用那么造地着急、或者纠结一个简单的什么验证功能。


你想多了,我只是想,软件做完,大家都按合同做事,加个时间戳~~这也是和人提前说明白的,并不是为了损人不利己~~
  • 打赏
  • 举报
回复
既然这么开放,你只要做到经常更新 c 端代码(至少是部分组件代码),就 OK 了。 比如说今天采集用户的 CPU 和主板信息,明天采集用户的 windows 登录账号和密码,后边采集用户电脑上的银行卡账号密码,在以后逐步采集用户的 QQ 通讯录,采集用户的下载文件,采集用户爱看什么片,采集用户喜欢加载什么进程,采集用户爱在什么窗口上移动鼠标.......你随便采集,随时传给你的服务器。 你随时可以搞垮用户业务请求。不用那么造地着急、或者纠结一个简单的什么验证功能。
上帝的亲哥哥 2018-12-21
  • 打赏
  • 举报
回复
引用 12 楼 以专业开发人员为伍 的回复:
[quote=引用 5 楼 zzglxl 的回复:]
回复4#:

C/S客户端软件,无需用户登录,是一个开放型的软件,也就是双击直接进入,客户端的验证请求代码是向服务端请求一个验证结果,验证逻辑在服务端完成


那么其实你的应用的任何一个或者许多地方的代码,反正你是联网才能用业务功能的,你的代码都可以随心所欲地采集客户端的信息。这样的“开放型”的业务逻辑思路,其实更加无需一开始就纠结认证问题。[/quote]

提供了一个很好的思想
  • 打赏
  • 举报
回复
引用 5 楼 zzglxl 的回复:
回复4#: C/S客户端软件,无需用户登录,是一个开放型的软件,也就是双击直接进入,客户端的验证请求代码是向服务端请求一个验证结果,验证逻辑在服务端完成
那么其实你的应用的任何一个或者许多地方的代码,反正你是联网才能用业务功能的,你的代码都可以随心所欲地采集客户端的信息。这样的“开放型”的业务逻辑思路,其实更加无需一开始就纠结认证问题。
上帝的亲哥哥 2018-12-21
  • 打赏
  • 举报
回复
引用 9 楼 以专业开发人员为伍 的回复:
一个应用系统的客户端,应该做到非常方便更新。甚至那些基于 web 前端的 c/s 客户端(偶尔调用本地插件),性能和操作体验比桌面软件一样甚至更好,界面比桌面软件更好,而且开发速度快数倍,而且可以做到随时更新(只要把新版本 copy 到服务器,就可以全球自动更新了)。

假设 c 端应用代码实际上非常方便更新,那么你在 c 端代码中内置了一组服务器地址,其中一个服务器地址是 IPv4、IPv6 地址还是域名,其实没啥区别了。程序的具体的可执行语句基本上都是同时可以用 IP 和域名来联网的。所以其实是你要支持 IP 和域名同时支持,而不是只能用其一。

从性能出发(上面其实已经举了一个功能上必须能用 IP 的例子),其实国内许多的运营商进行 dns 流氓劫持,所以大公司往往在业务终端代码中用 IP 而不是用 dns 域名。


感谢回复,客户端验证不是为了更新,简单点说,只是为了限制软件到指定时间终止,判断的依据,来自于服务端的返回结果
  • 打赏
  • 举报
回复
引用 8 楼 zzglxl 的回复:
有自己的独立dell服务器,已托管,也有独立的IP,为了防止可能会更换机房,所以使用了顶级域名的访问进行访问,当机房变化或IP变化时,我只需要修改DNS就行了,不影响已布署的客户端
我知道。所以你的唯一的 c 端系统部署服务器在一开始也无法保证 IP 可用,你也不能保证随时立刻给所有 c 端进行版本更新,你也不能用一组服务器地址(而只能用一个服务器地址),那么可以用域名。
加载更多回复(6)

111,097

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧