用加密狗控制软件的授权(C#)

加密狗授权方式介绍

每只加密狗都有一个固定的序列号,并且一般是无法修改的。软件运行时读取加密狗的序列号进行判断,序列号通过验证后才能正常使用软件。

选购一套加密狗开发套件

我选购了SaftNet的USB软件狗,入手后查阅开发资料(不同品牌的加密狗开发资料一般都不同),整理需要用到的开发资源如下:

SoftDogSetup.dll:提供加密狗驱动相关操作的DLL

需要用到以下方法:

(1)获取狗驱动程序安装信息接口函数GetDogDriverInfo,定义如下:

int PASCAL GetDogDriverInfo();

参数:无

返回值:

0 没有安装驱动程序

1 驱动版本相同(并口和usb)

2 USB驱动版本相同

3 并口驱动版本相同

4 已安装旧版本驱动 (并口和usb)

5 已安装旧版本USB驱动

6 已安装旧版本并口驱动

7 已安装新版本驱动 (并口和usb)

8 已安装新版本USB驱动

9 已安装新版本并口驱动

3008 没有管理员权限

(2)驱动安装的函数接口InstDriver,定义如下:

Int PASCAL InstDriver(int iFlag);

参数:

iFlag = 1 只安装USB狗驱动

iFlag = 2 只安装并口狗驱动

iFlag = 3 安装并口狗驱动和USB狗驱动

返回值:

如果运行成功则返回0,否则返回错误值。

(3)驱动卸载的函数接口UninstallDriver,定义如下:

int PASCAL UninstallDriver(int iFlag);

参数:

iFlag = 1 只卸载USB狗驱动

iFlag = 2 只卸载并口狗驱动

iFlag = 3 卸载并口狗驱动和USB狗驱动

返回值:

如果运行成功则返回0,否则返回错误值。

win32dll.dll:提供加密狗读写操作的DLL

需要用到以下方法:

(1)DWORD WINAPI DogRead (DWORD dwBytes,DWORD dwAddr,char *pData);

函数返回0表示读写成功,其它返回值为错误代码。

变量说明:

DWORD dwBytes:每次变换或读写操作的字节数

DWORD dwAddr:每次读写操作时狗中的首地址

char * pData :指向变换操作缓冲区的数据指针

实现加密狗授权(C#)

定义SoftDog类

首先定义一个SoftDog的静态类,静态类的主要特点如下:

它们仅包含静态成员。

它们不能被实例化。

它们是密封的,不可被继承。

它们不能包含实例构造函数。

using System;

using System.Runtime.InteropServices;

namespace HCommon.License

{

[StructLayout(LayoutKind.Sequential)]

public static class SoftDog

{

}

}

然后,使用DllImport引入使用到的dll方法,因为参数和返回值都很不友好,所以定义为private,不直接向外部公开。

///


/// 获取狗驱动程序安装信息接口函数GetDogDriverInfo

///

[DllImport("SoftDogSetup.dll", CharSet = CharSet.Ansi)]

private static extern ushort GetDogDriverInfo();

///


/// 驱动安装的函数接口InstDriver

///

[DllImport("SoftDogSetup.dll", CharSet = CharSet.Ansi)]

private static extern ushort InstDriver(ushort flag);

///


/// 驱动卸载的函数接口UninstallDriver

///

[DllImport("SoftDogSetup.dll", CharSet = CharSet.Ansi)]

private static extern ushort UninstallDriver(ushort flag);

///


/// 读取加密狗单函数接口DogRead

///

[DllImport("win32dll.dll", CharSet = CharSet.Ansi)]

private static extern uint DogRead(uint length, uint startIndex, byte[] data);

然后,定义加密狗驱动相关的public方法

public static bool DriverInstalled

{

get

{

ushort code = GetDogDriverInfo();

if (code == 3008) throw new HCommon.HException("{0}:没有管理员权限!", 3008);

if (code == 1 || code == 2 || code == 7 || code == 8) return true;

return false;

}

}

public static void InstallDriver()

{

ushort code = GetDogDriverInfo();

if (code == 3008) throw new HCommon.HException("{0}:没有管理员权限!", 3008);

if (code == 1 || code == 2 || code == 7 || code == 8) return;

if (code == 4 || code == 5)

UninstallDriver();

code = InstDriver(1);

if (code != 0) throw new HCommon.HException("{0}:安装驱动失败!", code);

}

public static void UninstallDriver()

{

ushort code = UninstallDriver(1);

if (code != 0) throw new HCommon.HException("{0}:卸载驱动失败!", code);

}

最后,定义读取加密狗序列号的public方法

public static string SerialNumber

{

get

{

uint code = 0;

byte[] data = new byte[100];

code = DogRead(0, 0, data);

if (code != 0)

{

throw new HCommon.HException("{0}:读取序列号失败!", code);

}

uint sn = BitConverter.ToUInt32(data, 0);

return sn.ToString();

}

}

使用SoftDog类

使用SoftDog的客户程序代码片段:

//软件启动时先判断是否安装加密狗驱动

if (!SoftDog.DriverInstalled)

{

SoftDog.InstallDriver();

MessageBox.Show("已安装加密狗驱动,请插入加密狗。");

}

//定义序列号属性

private static readonly string g_Key = "12345678";

private string SerialNumber

{

get

{

try

{

string sn = SoftDog.SerialNumber;

if (string.IsNullOrEmpty(sn)) return string.Empty;

return sn;

}

catch (Exception ex)

{

HCommon.ApplicationLog.LogException(ex);

}

return string.Empty;

}

}

//序列号判断的方法

private void CheckLicense()

{

if (SerialNumber != g_Key)

{

MessageBox.Show("对不起,计算机必须插入正确的加密狗,软件才能授权使用,请按确定退出系统。");

System.Windows.Forms.Application.Exit();

}

}

另外,软件运行时也应该定期地检查序列号,当发现加密狗已被拔出时终止软件的使用。需要定义一个Timer,每隔2分钟调用一次CheckLicense方法即可。

几种常用授权方式总结

软件序列号授权:支持单机,序列号容易泄漏。

软件序列号网络注册激活:授权控制最理想,但不支持单机。

加密狗授权:支持单机,效果比软件序列号授权好,但占用一个硬件端口。

加密狗授权方式介绍

每只加密狗都有一个固定的序列号,并且一般是无法修改的。软件运行时读取加密狗的序列号进行判断,序列号通过验证后才能正常使用软件。

选购一套加密狗开发套件

我选购了SaftNet的USB软件狗,入手后查阅开发资料(不同品牌的加密狗开发资料一般都不同),整理需要用到的开发资源如下:

SoftDogSetup.dll:提供加密狗驱动相关操作的DLL

需要用到以下方法:

(1)获取狗驱动程序安装信息接口函数GetDogDriverInfo,定义如下:

int PASCAL GetDogDriverInfo();

参数:无

返回值:

0 没有安装驱动程序

1 驱动版本相同(并口和usb)

2 USB驱动版本相同

3 并口驱动版本相同

4 已安装旧版本驱动 (并口和usb)

5 已安装旧版本USB驱动

6 已安装旧版本并口驱动

7 已安装新版本驱动 (并口和usb)

8 已安装新版本USB驱动

9 已安装新版本并口驱动

3008 没有管理员权限

(2)驱动安装的函数接口InstDriver,定义如下:

Int PASCAL InstDriver(int iFlag);

参数:

iFlag = 1 只安装USB狗驱动

iFlag = 2 只安装并口狗驱动

iFlag = 3 安装并口狗驱动和USB狗驱动

返回值:

如果运行成功则返回0,否则返回错误值。

(3)驱动卸载的函数接口UninstallDriver,定义如下:

int PASCAL UninstallDriver(int iFlag);

参数:

iFlag = 1 只卸载USB狗驱动

iFlag = 2 只卸载并口狗驱动

iFlag = 3 卸载并口狗驱动和USB狗驱动

返回值:

如果运行成功则返回0,否则返回错误值。

win32dll.dll:提供加密狗读写操作的DLL

需要用到以下方法:

(1)DWORD WINAPI DogRead (DWORD dwBytes,DWORD dwAddr,char *pData);

函数返回0表示读写成功,其它返回值为错误代码。

变量说明:

DWORD dwBytes:每次变换或读写操作的字节数

DWORD dwAddr:每次读写操作时狗中的首地址

char * pData :指向变换操作缓冲区的数据指针

实现加密狗授权(C#)

定义SoftDog类

首先定义一个SoftDog的静态类,静态类的主要特点如下:

它们仅包含静态成员。

它们不能被实例化。

它们是密封的,不可被继承。

它们不能包含实例构造函数。

using System;

using System.Runtime.InteropServices;

namespace HCommon.License

{

[StructLayout(LayoutKind.Sequential)]

public static class SoftDog

{

}

}

然后,使用DllImport引入使用到的dll方法,因为参数和返回值都很不友好,所以定义为private,不直接向外部公开。

///


/// 获取狗驱动程序安装信息接口函数GetDogDriverInfo

///

[DllImport("SoftDogSetup.dll", CharSet = CharSet.Ansi)]

private static extern ushort GetDogDriverInfo();

///


/// 驱动安装的函数接口InstDriver

///

[DllImport("SoftDogSetup.dll", CharSet = CharSet.Ansi)]

private static extern ushort InstDriver(ushort flag);

///


/// 驱动卸载的函数接口UninstallDriver

///

[DllImport("SoftDogSetup.dll", CharSet = CharSet.Ansi)]

private static extern ushort UninstallDriver(ushort flag);

///


/// 读取加密狗单函数接口DogRead

///

[DllImport("win32dll.dll", CharSet = CharSet.Ansi)]

private static extern uint DogRead(uint length, uint startIndex, byte[] data);

然后,定义加密狗驱动相关的public方法

public static bool DriverInstalled

{

get

{

ushort code = GetDogDriverInfo();

if (code == 3008) throw new HCommon.HException("{0}:没有管理员权限!", 3008);

if (code == 1 || code == 2 || code == 7 || code == 8) return true;

return false;

}

}

public static void InstallDriver()

{

ushort code = GetDogDriverInfo();

if (code == 3008) throw new HCommon.HException("{0}:没有管理员权限!", 3008);

if (code == 1 || code == 2 || code == 7 || code == 8) return;

if (code == 4 || code == 5)

UninstallDriver();

code = InstDriver(1);

if (code != 0) throw new HCommon.HException("{0}:安装驱动失败!", code);

}

public static void UninstallDriver()

{

ushort code = UninstallDriver(1);

if (code != 0) throw new HCommon.HException("{0}:卸载驱动失败!", code);

}

最后,定义读取加密狗序列号的public方法

public static string SerialNumber

{

get

{

uint code = 0;

byte[] data = new byte[100];

code = DogRead(0, 0, data);

if (code != 0)

{

throw new HCommon.HException("{0}:读取序列号失败!", code);

}

uint sn = BitConverter.ToUInt32(data, 0);

return sn.ToString();

}

}

使用SoftDog类

使用SoftDog的客户程序代码片段:

//软件启动时先判断是否安装加密狗驱动

if (!SoftDog.DriverInstalled)

{

SoftDog.InstallDriver();

MessageBox.Show("已安装加密狗驱动,请插入加密狗。");

}

//定义序列号属性

private static readonly string g_Key = "12345678";

private string SerialNumber

{

get

{

try

{

string sn = SoftDog.SerialNumber;

if (string.IsNullOrEmpty(sn)) return string.Empty;

return sn;

}

catch (Exception ex)

{

HCommon.ApplicationLog.LogException(ex);

}

return string.Empty;

}

}

//序列号判断的方法

private void CheckLicense()

{

if (SerialNumber != g_Key)

{

MessageBox.Show("对不起,计算机必须插入正确的加密狗,软件才能授权使用,请按确定退出系统。");

System.Windows.Forms.Application.Exit();

}

}

另外,软件运行时也应该定期地检查序列号,当发现加密狗已被拔出时终止软件的使用。需要定义一个Timer,每隔2分钟调用一次CheckLicense方法即可。

几种常用授权方式总结

软件序列号授权:支持单机,序列号容易泄漏。

软件序列号网络注册激活:授权控制最理想,但不支持单机。

加密狗授权:支持单机,效果比软件序列号授权好,但占用一个硬件端口。


相关文章

  • 信息安全论文
  • 浅析计算机网络安全问题及策略 摘要:计算机网络技术的发展,使人们可以在网络上得到想要的信息,极大地方便了工作和学习,提高了工作效率和生活水平.同时,由于网络安全直接关系到国家.企业及个人等领域的相关利益,因此网络安全也成为人们不可忽视的重要 ...查看


  • 计算机毕业论文范文5186953
  • (此文档为word 格式,下载后您可任意编辑修改!) 说明:毕业设计(论文)模版(信息技术系学生专用) 冀中职业学院 毕业设计(论文) 年级专业 0 8计算机应用技术 学生姓名 指导教师 专业负责人 答辩日期 毕业设计开题报告 摘 要 网络 ...查看


  • xx项目---技术需求说明书
  • 项目编号:KF2016001 XX项目 业务需求说明书 V1.0 XX银行XX分行 XX项目组 2016 年5月 修订文档历史记录 权复制或利用. 目录 1 引言....................................... ...查看


  • 信息安全基础
  • 第一章信息是事物运动的状态和状态变化的方式 信息安全的任务:是保护信息财产,以防止偶然的或未授权者对信息的恶意泄露.修改和破坏,从而导致信息的不可靠或无法处理等.这样可以使得我们在最大限度地利用信息为我们服务的同时而不招致损失或使损失最小. ...查看


  • 防火墙实验报告 2
  • 计算机安全实验报告 实验题目: 天网防火墙 windows安全设置 专业/班级: 计科一班 学 号: 姓 名: 李冲 指导教师: 一 天网防火墙技术 1 实验题目简述 个人防火墙是防止电脑中的信息被外部侵袭的一项技术,在系统中监控.阻止任何 ...查看


  • 大数据平台系统项目安全保障
  • 大数据平台系统项目 安全保障 安全是系统正常运行的保证.根据本项目的业务特点和需要,以及现有的网络安全状况,建立一个合理.实用.先进.可靠.综合.统一的安全保障体系,确保信息安全和业务系统的正常运行. 一. 规章制度建设 1.1 机房管理制 ...查看


  • 加密狗宝典2014
  • 加密狗宝典2014 1.单选题1 下面关于加密卡的描述正确的是 A:新的加密卡不需要注册就可以直接使用 B:寄回总部维修的加密卡不需要注册就可以直接使用 C:无论是新的加密卡还是维修过的卡都必须提交完注册才能使用 D:无论是新的加密卡还是维 ...查看


  • 家庭无线网络安全问题分析与解决
  • 海峡科学 技术报告 HAIXIAKEXUE 家庭无线网络安全问题分析与解决 福建船政交通职业学院 [摘要] 陈敏 在信息时代,计算机网络得到普遍的应用,无线局域网以其新的发展优势,补充有线网络的一些不足,成为家庭布 网的新宠儿,但是接踵而来 ...查看


  • 信息存储与安全
  • 论信息存储与安全 2014年3月,携程网带来了国内影响最大的网络安全事件:由于技术人员的疏忽,服务器上用于支付的银行卡信息大规模泄露.这就不得不谈到信息安全. 什么才是信息安全呢?我们可以从四个方面来论述信息安全:稽查性,保密性,完整性和可 ...查看


热门内容