用加密狗控制軟體的授權(C#)

來源:互聯網
上載者:User

標籤: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#)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.