標籤:style color io os 使用 ar for strong 資料
加密狗授權方式介紹
每隻加密狗都有一個固定的序號,並且一般是無法修改的。軟體運行時讀取加密狗的序號進行判斷,序號通過驗證後才能正常使用軟體。
選購一套加密狗開發套件
我選購了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,不直接向外部公開。
/// <summary>
/// 擷取狗驅動程式安裝資訊介面函數GetDogDriverInfo
/// </summary>
[DllImport("SoftDogSetup.dll", CharSet = CharSet.Ansi)]
private static extern ushort GetDogDriverInfo();
/// <summary>
/// 驅動安裝的函數介面InstDriver
/// </summary>
[DllImport("SoftDogSetup.dll", CharSet = CharSet.Ansi)]
private static extern ushort InstDriver(ushort flag);
/// <summary>
/// 驅動卸載的函數介面UninstallDriver
/// </summary>
[DllImport("SoftDogSetup.dll", CharSet = CharSet.Ansi)]
private static extern ushort UninstallDriver(ushort flag);
/// <summary>
/// 讀取加密狗單函數介面DogRead
/// </summary>
[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方法即可。
幾種常用授權方式總結
- 軟體序號授權:支援單機,序號容易泄漏。
- 軟體序號網路註冊啟用:授權控制最理想,但不支援單機。
- 加密狗授權:支援單機,效果比軟體序號授權好,但佔用一個硬體連接埠。
用加密狗控制軟體的授權(C#)