You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在SQL CLR的SqlFunction中验证程序集的证书签名?

在SQL CLR函数中验证程序集的证书签名

要在你的SqlFunction里添加验证逻辑,确保当前程序集是由你的证书签名的,核心思路是提取当前程序集的公钥,与你预先留存的证书公钥进行比对。下面是具体的实现步骤和代码示例:

实现步骤

  • 第一步:获取你用于签名的证书对应的完整公钥,并预先存储(可以硬编码到CLR代码中,或者从安全的地方读取)
  • 第二步:在CLR函数中获取当前执行程序集的公钥
  • 第三步:比对两个公钥,验证一致性

代码示例

下面是一个C#编写的SQL CLR函数,实现了签名验证逻辑:

using System;
using System.Data.SqlTypes;
using System.Reflection;
using Microsoft.SqlServer.Server;

public partial class UserDefinedFunctions
{
    // 替换为你自己证书的完整公钥字节数组
    private static readonly byte[] _expectedPublicKey = new byte[] { 
        /* 这里填入你的证书公钥字节,比如:0x00, 0x24, 0x00, 0x00... */
    };

    [SqlFunction(DataAccess = DataAccessKind.None)]
    public static SqlBoolean ValidateAssemblySignature()
    {
        // 获取当前执行的程序集
        var currentAssembly = Assembly.GetExecutingAssembly();
        var assemblyPublicKey = currentAssembly.GetName().GetPublicKey();

        // 先比对长度,快速排除不匹配的情况
        if (assemblyPublicKey.Length != _expectedPublicKey.Length)
        {
            return SqlBoolean.False;
        }

        // 逐字节比对公钥
        for (int i = 0; i < assemblyPublicKey.Length; i++)
        {
            if (assemblyPublicKey[i] != _expectedPublicKey[i])
            {
                return SqlBoolean.False;
            }
        }

        return SqlBoolean.True;
    }
}

关键细节说明

如何获取预期的公钥?

你可以通过本地控制台程序从已签名的程序集或证书中提取公钥:

// 从已签名的程序集提取
var asm = System.Reflection.Assembly.LoadFrom("YourSignedAssembly.dll");
var pubKey = asm.GetName().GetPublicKey();
// 输出公钥字节数组,复制到CLR代码中
foreach (byte b in pubKey)
{
    Console.Write($"0x{b:X2}, ");
}

为什么不用公钥令牌?

Assembly.GetName().GetPublicKeyToken()返回的是公钥的SHA-1哈希值(8字节),虽然体积小,但存在极低的碰撞风险。比对完整公钥是更安全的验证方式。

安全注意事项

  • 不要在代码中暴露私钥,只需要公钥即可完成验证
  • 如果担心硬编码的公钥被反编译,可以考虑将公钥加密存储,在函数中解密后再比对;或者从SQL Server的sys.certificates系统视图中读取你的证书公钥(需要确保CLR程序集有足够权限访问该视图)

内容的提问来源于stack exchange,提问作者VG1

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:33:23