用加密狗控制軟件的受權(C#)

加密狗受權方式介紹

每隻加密狗都有一個固定的序列號,而且通常是沒法修改的。軟件運行時讀取加密狗的序列號進行判斷,序列號經過驗證後才能正常使用軟件。html

選購一套加密狗開發套件

我選購了SaftNet的USB軟件狗,入手後查閱開發資料(不一樣品牌的加密狗開發資料通常都不一樣),整理須要用到的開發資源以下:網絡

  • SoftDogSetup.dll:提供加密狗驅動相關操做的DLL

須要用到如下方法:函數

(1)獲取狗驅動程序安裝信息接口函數GetDogDriverInfo,定義以下:ui

int PASCAL GetDogDriverInfo();加密

參數:無spa

返回值:指針

0 沒有安裝驅動程序code

1 驅動版本相同(並口和usb)orm

2 USB驅動版本相同htm

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方法便可。

幾種經常使用受權方式總結

  • 軟件序列號受權:支持單機,序列號容易泄漏。
  • 軟件序列號網絡註冊激活:受權控制最理想,但不支持單機。
  • 加密狗受權:支持單機,效果比軟件序列號受權好,但佔用一個硬件端口。
相關文章
相關標籤/搜索