# SecurityLibrary **Repository Path**: haitangyunchi/Securitylibrary ## Basic Information - **Project Name**: SecurityLibrary - **Description**: 安全信息检查库,目前主要用来存储黑名单的,功能后续再加入 - **Primary Language**: C# - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-06-16 - **Last Updated**: 2025-06-18 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # SecurityLibrary.dll 使用手册 首先程序集引用 SecurityLibrary.dll 并在程序中引用 using SecurityLibrary; 如果使用中报错,请使用相同的方式引用 Newtonsoft.Json.dll 安全文件固定名称:Security.enc 新增:验证黑白名单,你可以把安全文件当做白名单使用,也可以当做黑名单使用 新增:生成机器码 详情见下面说明 GenerateMachineCode() ### 首先声明实例: ``` private string secretKey; private Security security; ``` 在主代码头部实例化: ``` secretKey = KeyManager.LoadKey(); // 你的秘钥获取方法 security = new Security(secretKey); // 实例化安全库 ``` 调用实例 ``` using System; using System.ComponentModel; using System.Linq; using System.Management; using System.Windows.Forms; using SecurityLibrary; // 程序集引用后,这里 using 引用一下 namespace MyApp { public partial class From1 : Form { // 私有字段声明 private string secretKey; // 存储从安全存储中加载的加密密钥(核心敏感数据) private Security security; // SecurityLibrary的安全验证实例(核心功能入口) public From1() { InitializeComponent(); // 加载加密密钥(从安全存储中获取,如配置文件、注册表或硬件保护存储) // KeyManager.LoadKey() 是自定义方法,具体实现可能包括: // - 从加密配置文件读取密钥 // - 从Windows DPAPI保护的存储中解密获取 // - 从硬件安全模块(HSM)或可信执行环境(TEE)中读取 secretKey = KeyManager.LoadKey(); // 初始化安全验证实例(传入加载的密钥) // Security类来自SecurityLibrary,用于后续执行黑白名单验证、机器码生成等操作 security = new Security(secretKey); } // 后续业务代码方法...(例如:按钮点击事件、菜单操作、核心业务逻辑等) } ``` ### 黑名单验证 返回布尔值 用户和机器码两者填写其一即可,或者都填写也行,其中安全文件路径不能为空,为空使用默认的文件 ``` 完整调用 var result = seccurity.Blacklist(userToCheck: 你的软件用户,machineToCheck: 机器码,filePath: 安全文件路径); 只验证用户: var result = seccurity.Blacklist(userToCheck: 你的软件用户,filePath: 安全文件路径); 或者使用默认安全文件 var result = seccurity.Blacklist(userToCheck: 你的软件用户); 只验证机器码,把上面的userToCheck换成machineToCheck即可 另一种写法 var result = seccurity.Blacklist("你的软件用户","机器码","安全文件路径); 只验证其中一种(例如机器码) var result = seccurity.Blacklist("","机器码","安全文件路径); ``` 调用实例: ``` private void btnBlacklistValidate_Click(object sender, EventArgs e) { try { // 首先检查软件是否启用 var (_, _, isEnabled) = seccurity.ReadSecuritylist(); if (!isEnabled) { MessageBox.Show("软件已被管理员禁用", "系统禁用", MessageBoxButtons.OK, MessageBoxIcon.Stop); return; } // 输入验证 if (string.IsNullOrWhiteSpace(txtUser.Text) && string.IsNullOrWhiteSpace(txtMachine.Text)) { MessageBox.Show("必须输入用户名或机器码进行验证", "输入错误", MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } // 调用黑名单验证 var result = seccurity.blacklist( userToCheck: string.IsNullOrWhiteSpace(txtUser.Text) ? null : txtUser.Text.Trim(), machineToCheck: string.IsNullOrWhiteSpace(txtMachine.Text) ? null : txtMachine.Text.Trim()); if (!result.IsValid) { // 验证失败处理 MessageBox.Show(result.Message, "验证失败", MessageBoxButtons.OK, MessageBoxIcon.Error); MessageBox.Show("您的账户或设备已被禁止使用本软件\n请联系管理员获取帮助", "访问被拒绝", MessageBoxButtons.OK, MessageBoxIcon.Stop); return; } // 验证通过后的处理 MessageBox.Show("验证通过,欢迎使用本系统", "验证成功", MessageBoxButtons.OK, MessageBoxIcon.Information); // 此处继续执行后续业务代码... } catch (Exception ex) { MessageBox.Show($"系统错误: {ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); } } ``` ### 白名单验证 返回布尔值 用户和机器码两者填写其一即可,或者都填写也行,软件会自动识别其中一项 ``` var result = seccurity.Whitelist(userToCheck: 你的软件用户,machineToCheck: 机器码); ``` 调用实例: ``` private void btnWhitelistValidate_Click(object sender, EventArgs e) { try { // 首先检查软件是否启用 var (_, _, isEnabled) = seccurity.ReadSecuritylist(); if (!isEnabled) { MessageBox.Show("软件已被管理员禁用", "系统禁用", MessageBoxButtons.OK, MessageBoxIcon.Stop); return; } // 输入验证 if (string.IsNullOrWhiteSpace(txtUser.Text) && string.IsNullOrWhiteSpace(txtMachine.Text)) { MessageBox.Show("必须输入用户名或机器码进行验证", "输入错误", MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } // 调用白名单验证 var result = seccurity.Whitelist( userToCheck: string.IsNullOrWhiteSpace(txtUser.Text) ? null : txtUser.Text.Trim(), machineToCheck: string.IsNullOrWhiteSpace(txtMachine.Text) ? null : txtMachine.Text.Trim()); if (!result.IsValid) { MessageBox.Show(result.Message, "验证失败", MessageBoxButtons.OK, MessageBoxIcon.Error); MessageBox.Show("您未被授权使用本系统\n请联系管理员添加您的账户或设备", "访问被拒绝", MessageBoxButtons.OK, MessageBoxIcon.Stop); return; } MessageBox.Show("验证通过,欢迎使用本系统", "验证成功", MessageBoxButtons.OK, MessageBoxIcon.Information); // 后续业务代码... } catch (Exception ex) { MessageBox.Show($"系统错误: {ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); } } ``` ### 读取安全文件列表 返回数组 ``` var (users, machines, isEnabled) = seccurity.ReadSecuritylist(); ``` 调用实例: ``` private void LoadSecuritylist() { try { var (users, machines, isEnabled) = seccurity.ReadSecuritylist(); // 将读取的数据显示到对应文本框 txtUsers.Text = string.Join(Environment.NewLine, users); txtMachines.Text = string.Join(Environment.NewLine, machines); chkEnabled.Checked = isEnabled; statusLabel.Text = "安全文件加载成功"; } catch (Exception ex) { // 文件不存在时显示空内容,其他错误显示提示 if (!(ex is System.IO.FileNotFoundException)) { MessageBox.Show($"加载安全文件失败: {ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Warning); } statusLabel.Text = "未发现安全文件!"; } } ``` ### 生成安全文件 ``` bool success = seccurity.GenerateSecuritylist(AllowedUsers: 用户数组, AllowedMachines: 机器码数组, enableSoftware: 是否启用); ``` 调用实例: ``` private void btnGenerate_Click(object sender, EventArgs e) { // 处理用户输入 - 按行分割并去除空白项 var users = txtUsers.Text.Split(new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries) .Select(u => u.Trim()) .Where(u => !string.IsNullOrEmpty(u)) .ToArray(); var machines = txtMachines.Text.Split(new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries) .Select(m => m.Trim()) .Where(m => !string.IsNullOrEmpty(m)) .ToArray(); // 调用DLL生成安全文件 bool success = seccurity.GenerateSecuritylist( AllowedUsers: users, AllowedMachines: machines, enableSoftware: chkEnabled.Checked); // 显示操作结果 if (success) { statusLabel.Text = "安全文件生成成功"; MessageBox.Show($"安全文件生成成功!{Environment.NewLine}文件已保存为 Security.enc","成功", MessageBoxButtons.OK, MessageBoxIcon.Information); } else { statusLabel.Text = "安全文件生成失败"; MessageBox.Show("安全文件生成失败","错误", MessageBoxButtons.OK, MessageBoxIcon.Error); } } ``` ### 生成机器码 返回 64字符串(256位哈希值) 采用 主板序列号 + CPU + 第一块硬盘序列号 + 主网卡MAC + 秘钥 调用方法 ``` string MachineCode = seccurity.GenerateMachineCode("秘钥"); ``` 调用实例 ``` static void Main(string[] args) { string MachineCode = seccurity.GenerateMachineCode(secretKey); Console.WriteLine(MachineCode); } 输出结果:D59DFDB186CC7D5C43CB9F331E2430C5047035BE7E459C812AD7834D3B9E9223 BD5BE69FF4EC4170402E802E7F7B710F2BBCD559CC5BDE3B5596526970949D26 FBCFA1DF3F305431429027FF2F63C9525A077F62DD242CD4D25B8103AD9ADB23 实验秘钥不同,机器码不同,保证绝对唯一性 ``` 根据公式计算: 其中: | 输入数量(k) | 碰撞概率(P) | 概率说明 | |:-----------|:-----------:|-----------:| | | | 100万台设备,碰撞概率几乎为0。 | | | | 100亿台设备,碰撞概率几乎为0。 | | | | 即使有百亿亿设备,碰撞概率仍可忽略不计。 |