用加密狗控制软件的授权(C#)
加密狗授權(quán)方式介紹
每只加密狗都有一個(gè)固定的序列號(hào),并且一般是無(wú)法修改的。軟件運(yùn)行時(shí)讀取加密狗的序列號(hào)進(jìn)行判斷,序列號(hào)通過驗(yàn)證后才能正常使用軟件。
選購(gòu)一套加密狗開發(fā)套件
我選購(gòu)了SaftNet的USB軟件狗,入手后查閱開發(fā)資料(不同品牌的加密狗開發(fā)資料一般都不同),整理需要用到的開發(fā)資源如下:
- SoftDogSetup.dll:提供加密狗驅(qū)動(dòng)相關(guān)操作的DLL
需要用到以下方法:
(1)獲取狗驅(qū)動(dòng)程序安裝信息接口函數(shù)GetDogDriverInfo,定義如下:
int PASCAL GetDogDriverInfo();
參數(shù):無(wú)
返回值:
0 沒有安裝驅(qū)動(dòng)程序
1 驅(qū)動(dòng)版本相同(并口和usb)
2 USB驅(qū)動(dòng)版本相同
3 并口驅(qū)動(dòng)版本相同
4 已安裝舊版本驅(qū)動(dòng) (并口和usb)
5 已安裝舊版本USB驅(qū)動(dòng)
6 已安裝舊版本并口驅(qū)動(dòng)
7 已安裝新版本驅(qū)動(dòng) (并口和usb)
8 已安裝新版本USB驅(qū)動(dòng)
9 已安裝新版本并口驅(qū)動(dòng)
3008 沒有管理員權(quán)限
(2)驅(qū)動(dòng)安裝的函數(shù)接口InstDriver,定義如下:
Int PASCAL InstDriver(int iFlag);
參數(shù):
iFlag = 1 只安裝USB狗驅(qū)動(dòng)
iFlag = 2 只安裝并口狗驅(qū)動(dòng)
iFlag = 3 安裝并口狗驅(qū)動(dòng)和USB狗驅(qū)動(dòng)
返回值:
如果運(yùn)行成功則返回0,否則返回錯(cuò)誤值。
(3)驅(qū)動(dòng)卸載的函數(shù)接口UninstallDriver,定義如下:
int PASCAL UninstallDriver(int iFlag);
參數(shù):
iFlag = 1 只卸載USB狗驅(qū)動(dòng)
iFlag = 2 只卸載并口狗驅(qū)動(dòng)
iFlag = 3 卸載并口狗驅(qū)動(dòng)和USB狗驅(qū)動(dòng)
返回值:
如果運(yùn)行成功則返回0,否則返回錯(cuò)誤值。
- win32dll.dll:提供加密狗讀寫操作的DLL
需要用到以下方法:
(1)DWORD WINAPI DogRead (DWORD dwBytes,DWORD dwAddr,char *pData);
函數(shù)返回0表示讀寫成功,其它返回值為錯(cuò)誤代碼。
變量說(shuō)明:
DWORD dwBytes:每次變換或讀寫操作的字節(jié)數(shù)
DWORD dwAddr:每次讀寫操作時(shí)狗中的首地址
char * pData :指向變換操作緩沖區(qū)的數(shù)據(jù)指針
實(shí)現(xiàn)加密狗授權(quán)(C#)
定義SoftDog類
首先定義一個(gè)SoftDog的靜態(tài)類,靜態(tài)類的主要特點(diǎn)如下:
- 它們僅包含靜態(tài)成員。
- 它們不能被實(shí)例化。
- 它們是密封的,不可被繼承。
- 它們不能包含實(shí)例構(gòu)造函數(shù)。
using System;
using System.Runtime.InteropServices;
namespace HCommon.License
{
????[StructLayout(LayoutKind.Sequential)]
????public static class SoftDog
????{
????}
}
然后,使用DllImport引入使用到的dll方法,因?yàn)閰?shù)和返回值都很不友好,所以定義為private,不直接向外部公開。
/// <summary>
/// 獲取狗驅(qū)動(dòng)程序安裝信息接口函數(shù)GetDogDriverInfo
/// </summary>
[DllImport("SoftDogSetup.dll", CharSet = CharSet.Ansi)]
private static extern ushort GetDogDriverInfo();
/// <summary>
/// 驅(qū)動(dòng)安裝的函數(shù)接口InstDriver
/// </summary>
[DllImport("SoftDogSetup.dll", CharSet = CharSet.Ansi)]
private static extern ushort InstDriver(ushort flag);
/// <summary>
/// 驅(qū)動(dòng)卸載的函數(shù)接口UninstallDriver
/// </summary>
[DllImport("SoftDogSetup.dll", CharSet = CharSet.Ansi)]
private static extern ushort UninstallDriver(ushort flag);
/// <summary>
/// 讀取加密狗單函數(shù)接口DogRead
/// </summary>
[DllImport("win32dll.dll", CharSet = CharSet.Ansi)]
private static extern uint DogRead(uint length, uint startIndex, byte[] data);
然后,定義加密狗驅(qū)動(dòng)相關(guān)的public方法
public static bool DriverInstalled
{
????get
????{
????????ushort code = GetDogDriverInfo();
????????if (code == 3008) throw new HCommon.HException("{0}:沒有管理員權(quán)限!", 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}:沒有管理員權(quán)限!", 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}:安裝驅(qū)動(dòng)失敗!", code);
}
public static void UninstallDriver()
{
????ushort code = UninstallDriver(1);
????if (code != 0) throw new HCommon.HException("{0}:卸載驅(qū)動(dòng)失敗!", code);
}
最后,定義讀取加密狗序列號(hào)的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}:讀取序列號(hào)失敗!", code);
????????}
????????uint sn = BitConverter.ToUInt32(data, 0);
????????return sn.ToString();
????}
}
使用SoftDog類
使用SoftDog的客戶程序代碼片段:
…
//軟件啟動(dòng)時(shí)先判斷是否安裝加密狗驅(qū)動(dòng)
if (!SoftDog.DriverInstalled)
{
????SoftDog.InstallDriver();
????MessageBox.Show("已安裝加密狗驅(qū)動(dòng),請(qǐng)插入加密狗。");
}
…
//定義序列號(hào)屬性
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;
????}
}
//序列號(hào)判斷的方法
private void CheckLicense()
{
????if (SerialNumber != g_Key)
????{
????????MessageBox.Show("對(duì)不起,計(jì)算機(jī)必須插入正確的加密狗,軟件才能授權(quán)使用,請(qǐng)按確定退出系統(tǒng)。");
????????System.Windows.Forms.Application.Exit();
????}
}
…
另外,軟件運(yùn)行時(shí)也應(yīng)該定期地檢查序列號(hào),當(dāng)發(fā)現(xiàn)加密狗已被拔出時(shí)終止軟件的使用。需要定義一個(gè)Timer,每隔2分鐘調(diào)用一次CheckLicense方法即可。
幾種常用授權(quán)方式總結(jié)
- 軟件序列號(hào)授權(quán):支持單機(jī),序列號(hào)容易泄漏。
- 軟件序列號(hào)網(wǎng)絡(luò)注冊(cè)激活:授權(quán)控制最理想,但不支持單機(jī)。
- 加密狗授權(quán):支持單機(jī),效果比軟件序列號(hào)授權(quán)好,但占用一個(gè)硬件端口。
總結(jié)
以上是生活随笔為你收集整理的用加密狗控制软件的授权(C#)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如此广告短信
- 下一篇: 导入Excel2007/2010出现“找