高分求助!如何在服务器端加密!!大家都进来看看吧,帮顶也有分!!!

dayuforever 2006-07-21 09:06:50
小弟参与开发了一套规划办公自动化系统,C/S结构的,基于ORACLE数据库。
服务器端只安装了ORACLE9i与ArcGis软件,
在客户端安装我们以vb开发的软件。
本来为了保护版权,在开发的软件中加入了检测加密狗的函数,即是客户端必须安装加密狗的驱动并插上加密狗通过验证后才能正常运行本程序,这样每一个客户端就必须配备一只加密狗。
后来用户觉得不方便要求去掉客户端的加密狗。但为了保护我们的软件不让随便移植我就想至少在服务器端做个加密程序,这样客户端是可以随便扩展,但服务器配上加密狗就能够限制其任意移植。
现在的问题是我们开发的软件是纯在客户端安装的,服务器端就安装了基础软件比如ORACLE什么的,考虑了很久也没有找到很好的思路:如何做一个服务器端的程序让客户端运行的时候根据服务器端的这个程序是否开启来控制其能否运行?
开始想的是这个服务器端程序控制ORACLE的服务启动,但别人在Windows的计算机管理里面就可以控制服务啊;后来再想在ORACLE里建立一张表,让服务器端程序启动后间隔规定时间往里面写入信息,然后客户端程序实时访问该表以判断服务器端程序是否在运行,运行就继续正常的操作,没有运行就终止客户端的访问,但往表里写入什么信息呢,时间吗?如果局域网内时间不一致呢?状态吗?那如何描述这个状态呢?
我已经晕了,一筹莫展数日。
不知道大家有些什么好的建议和意见啊,请一定帮帮忙吧!在此先拜了!分不够再加啊!!
...全文
632 45 打赏 收藏 转发到动态 举报
写回复
用AI写文章
45 条回复
切换为时间正序
请发表友善的回复…
发表回复
dayuforever 2006-08-29
  • 打赏
  • 举报
回复
都无人问津,
得,
就此结帖,
感谢楼上各位大大!
dayuforever 2006-08-15
  • 打赏
  • 举报
回复
呵呵,各位老大,前段时间不断出差,实在没有时间顾及这个问题,不好意思啊。
是这样的,现在有一个我觉得是比较简单的方案,无论从实现原理还是实现过程而言,其流程如下:
1、服务器端:开始运行,检测T_SERVER表是否存在。如果没有就建立此表;有就写入信息,包括比如启动该程序的时间,更新时间,客户端数等。以后每隔一段固定时间实时检测该表,当客户端数达到某一数值,就执行删除或清空该表操作
2、一般客户端:开始运行,检测T_SERVER表是否存在。如果没有就提示并退出;有就写入信息,包括比如更新时间,客户端数+1 等
3、系统管理员客户端:开始运行,检测T_SERVER表是否存在。当进入某个特定模块或者执行某个功能时,触发函数自动删除或清空该表操作
4、加密狗外壳:包裹在服务器端,作为程序合法入口的检查工具。
不得不承认,下意识地回避了SOCKET通信、硬件序列号读取等思路,还是觉得自己在这些方面没有多大把握啊。
不知大家对我那个简单且笨的方法有什么意见啊?
希望多提看法,谢谢!
dayuforever 2006-08-15
  • 打赏
  • 举报
回复
各位大大,再给点意见啊!
dayuforever 2006-07-26
  • 打赏
  • 举报
回复
呵呵刚出差回来
容我再想想……
吾非大神 2006-07-26
  • 打赏
  • 举报
回复
帮顶]
学习
bizshow 2006-07-23
  • 打赏
  • 举报
回复
楼主我是来帮你顶的...给分啊
  • 打赏
  • 举报
回复
所以不能用简单的成功指令之类的,也不能是一个由加密狗产生的没变化的(即便加密处理了,但一个加密狗岂不就是对应一个加密后的结果?)数据(不管多复杂)。
  • 打赏
  • 举报
回复
发的数据包可以拦截,用个WPE就很容易做个模拟包
熊孩子开学喽 2006-07-21
  • 打赏
  • 举报
回复
服务器段加一个验证程序
客户端将机器信息发送到服务器段记录好.
当装到新的机器上,因为和记录的原有客户端信息不同,就不能运行.
of123 2006-07-21
  • 打赏
  • 举报
回复
>winsock不失为一个方法,客户那边是内外两套网络来回切换,如果总是以发送消息来确认的话难保当网络切换时不出现丢失的情况啊。
>大家还有别的办法么?

如果使用 TCP 协议,它出现错误的概率和客户访问服务端数据库出现错误的概率相同。如果这个概率不能容忍,你的系统压根就不可用。

另一个更严格的方式是,客户不直接访问数据库,而是向服务程序发消息,由服务程序查询并返回。因为服务程序有加密狗控制,就可以完全控制数据的合法访问。但这样做需要更高的技巧,否则效率会比较低。

你最初的设想也很好。实际上你的目的是用一个记录数据来表示当前数据的合法性。可以这样来实现:
1 客户端和服务端共享一个密钥。也可以是一组密钥,通过某种规则或信息来轮换使用,可以加大破解难度。

2 服务定时检查狗的合法性。如果合法,取得一个随机数串,用一个密钥加密,将随机数和密文(还可以包括密钥号)同时写入一个表记录中。客户端查询后,用对应的密钥加密(或解密)并比对。如果成功,继续;否则警示并退出。

3 如果服务端狗验证失败,随意改写该表记录,例如全0或全F。这必将导致客户验证失败。
dayuforever 2006-07-21
  • 打赏
  • 举报
回复
楼上的说的很对,我的只是采用服务式数据库的多用户系统。看来以后还要多在结构设计上下功夫啊。
我觉得问题不在于如何确定服务器端程序的唯一性,反正有加密狗控制,只要我在程序中加入检测加密狗的函数就可以控制了。
最主要的问题是,如何保证服务器端程序与客户端程序相互间信息的确认和交换呢?
  • 打赏
  • 举报
回复
当然,所谓安装,不仅是安装一个正常的数据库和一个千篇一律的通讯验证程序,而是要将授权ID的信息注入,每次运行都检测唯一标识,与授权ID进行验证。

如果不考虑性能的话,还可进一步用授权ID对数据库关键数据进行加解密操作。
dayuforever 2006-07-21
  • 打赏
  • 举报
回复
winsock不失为一个方法,客户那边是内外两套网络来回切换,如果总是以发送消息来确认的话难保当网络切换时不出现丢失的情况啊。
大家还有别的办法么?
of123 2006-07-21
  • 打赏
  • 举报
回复
楼上忘了,他有加密狗。

你方案是“穷人”方案,业余用用。
加密狗或 PKI 安全认证模块可以加载到任何服务器上,而且是厂方授权的。它是一个物理存在。而系列号之类都是信息存在,容易破解的。

使用加密狗对用户更友好,因为易于维护和迁移。
  • 打赏
  • 举报
回复
简单地写个服务端程序也没用,连库带程序一起拷走不就破了?
关键是写入读取服务端硬件设备唯一标识。
参照授权序列号的制作即可解决这个问题,让用户要安装服务端就必须给你们发一个程序报出的加密后的机器码,你们根据它给出运算后的授权ID,用户用此序列号进行安装,每一个序列号只针对唯一一台服务器设备有效,更换硬件后必须重新授权。
白发程序猿 2006-07-21
  • 打赏
  • 举报
回复
帮顶
of123 2006-07-21
  • 打赏
  • 举报
回复
客户程序不也是你写的吗?
客户端启动时,向服务端发一个消息。服务端接收到以后,检查验证狗,给客户发回成功或失败消息。
如果失败,客户端给出警示并终止运行。

你的 C/S 架构好像不完整,并没有写服务程序。你的架构只能算是采用服务式数据库的多用户系统。

用 Winsock 写简单的客户/服务程序就可以解决。
dayuforever 2006-07-21
  • 打赏
  • 举报
回复
但是完全可能在别处重新安装一套数据库啊,反正ORACLE的数据导入导出也就是一体力活,
客户端安装程序那不就可以随处配套安装了?
一笑拔剑 2006-07-21
  • 打赏
  • 举报
回复
数据库都放服务端
他客户端能跑那去阿?
射天狼 2006-07-21
  • 打赏
  • 举报
回复
写一个服务端程序,通过SOCKET通信与客户端进行连接,启动客户端的时候先连接服务端,服务检测到加密狗之后给客户端发一个成功指令,否则客户端提示:盗版软件。


╭═══════════════════╮
║ 免费的源码、工具网站,欢迎大家访问!║
║ http://www.j2soft.cn/        ║
╰═══════════════════╯
加载更多回复(25)

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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