Skip to content

Blazor中条码加密服务实现

About 867 wordsAbout 3 min

Blazor加密安全MiniExcel

2024-05-14

在实验室信息管理系统(LIS)中,条码是一个非常重要的标识符,它用于追踪样本、记录检测结果等。为了保护数据安全,我们需要对条码进行加密处理。本文将介绍如何在Blazor应用中实现一个简单但安全的条码加密服务,并结合 MiniExcel 实现 Excel 文件的批量处理。

1. 设计接口

首先,我们定义了一个条码加密服务的接口:

public interface IBarcodeEncryption
{
    Task<string> EncryptAsync(string barcode);
    Task<string> DecryptAsync(string encryptedBarcode);
}

这个接口定义了两个主要方法:

  • EncryptAsync: 用于加密原始条码
  • DecryptAsync: 用于解密加密后的条码

2. 实现加密服务

我们使用XOR(异或)加密算法实现了条码加密服务:

public class BarcodeEncryptionService : IBarcodeEncryption
{
    private static readonly string SecretKey = "BARCODE2024";
    
    public Task<string> EncryptAsync(string barcode)
    {
        if (string.IsNullOrEmpty(barcode)) return Task.FromResult(string.Empty);
        
        byte[] barcodeBytes = Encoding.UTF8.GetBytes(barcode);
        byte[] keyBytes = Encoding.UTF8.GetBytes(SecretKey);
        
        byte[] result = new byte[barcodeBytes.Length];
        for (int i = 0; i < barcodeBytes.Length; i++)
        {
            result[i] = (byte)(barcodeBytes[i] ^ keyBytes[i % keyBytes.Length]);
        }
        
        return Task.FromResult(Convert.ToBase64String(result));
    }
    
    public Task<string> DecryptAsync(string encryptedBarcode)
    {
        if (string.IsNullOrEmpty(encryptedBarcode)) return Task.FromResult(string.Empty);
        
        try
        {
            byte[] encryptedBytes = Convert.FromBase64String(encryptedBarcode);
            byte[] keyBytes = Encoding.UTF8.GetBytes(SecretKey);
            
            byte[] result = new byte[encryptedBytes.Length];
            for (int i = 0; i < encryptedBytes.Length; i++)
            {
                result[i] = (byte)(encryptedBytes[i] ^ keyBytes[i % keyBytes.Length]);
            }
            
            return Task.FromResult(Encoding.UTF8.GetString(result));
        }
        catch
        {
            return Task.FromResult(string.Empty);
        }
    }
}

3. 注册服务

Program.cs中注册服务:

builder.Services.AddScoped<IBarcodeEncryption, BarcodeEncryptionService>();

4. 使用 MiniExcel 实现批量处理

MiniExcel 是一个轻量级的 Excel 处理库,相比 EPPlus 具有以下优点:

  1. 更小的内存占用
  2. 更快的处理速度
  3. 更简单的 API

首先安装 NuGet 包:

dotnet add package MiniExcel

然后在 Blazor 组件中实现批量处理:

@page "/qc/convertid"
@using MiniExcelLibs
@inject IBarcodeEncryption BarcodeEncryption

@code {
    private async Task LoadFile(InputFileChangeEventArgs e)
    {
        var stream = new MemoryStream();
        await file.OpenReadStream().CopyToAsync(stream);
        stream.Position = 0;
        
        // 读取Excel数据
        var rows = await stream.QueryAsync();
        var dataList = rows.ToList();
        
        // 获取表头
        var headers = ((IDictionary<string, object>)dataList[0]).Keys.ToList();
        
        // 查找条码列
        var barcodeColName = headers.FirstOrDefault(h => 
            h.Contains("条码号", StringComparison.OrdinalIgnoreCase));
            
        // 处理每一行的条码
        foreach (IDictionary<string, object> row in dataList)
        {
            var barcode = row[barcodeColName]?.ToString();
            if (!string.IsNullOrEmpty(barcode))
            {
                var encryptedBarcode = await BarcodeEncryption.EncryptAsync(barcode);
                row[barcodeColName] = encryptedBarcode;
            }
        }

        // 保存处理后的文件
        await outputStream.SaveAsAsync(dataList);
    }
}

使用 MiniExcel 的主要步骤:

  1. 使用 QueryAsync() 读取 Excel 数据
  2. 数据以字典列表的形式返回,方便处理
  3. 使用 SaveAsAsync() 保存修改后的数据

5. 安全性考虑

  1. 密钥管理

    • 在生产环境中,建议将密钥存储在配置文件或安全的密钥管理系统中
    • 定期更换密钥
  2. 传输安全

    • 确保加密后的数据通过HTTPS传输
    • 避免在日志中记录加密后的数据
  3. 错误处理

    • 对解密失败的情况进行适当处理
    • 不要在错误消息中暴露敏感信息
  4. Excel 文件处理

    • 验证文件大小和格式
    • 使用流式处理避免内存溢出
    • 处理完成后及时释放资源

总结

通过结合条码加密服务和 MiniExcel,我们实现了:

  1. 安全的条码加密/解密功能
  2. 高效的 Excel 批量处理
  3. 用户友好的 Web 界面

这个解决方案适用于需要批量处理敏感数据的场景,如实验室信息系统中的样本条码加密。通过使用 MiniExcel,我们还获得了更好的性能和更低的资源消耗。


作者:Claude

日期:2024-05-14

标签:Blazor, 加密, 安全, MiniExcel