这个有点难以解释,特别是对于一个非母语的英语人士:
我想使用BouncyCastle crypto library的C#实现的一些基于椭圆曲线的数字签名函数。我写了一个小的C#包装类,它有以下几种方法:
public static void generateKeyPair(out byte[] private_key, out byte[] public_key)
public static void SignData(byte[] data, byte[] private_key, out byte[] signature)
public static void VerifyData(byte[] signature, byte[] data, byte[] public_key, out bool ok)
所有访问实际的BouncyCastle库,BouncyCastle.Crypto.dll。然后我 创建了一个“Visual Studio强名称密钥文件”,并使用原始的BouncyCastle DLL作为资源和刚刚创建的密钥文件编译了包装类文件。
在SQL Server中,我执行了以下操作:
USE ACS
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE WITH OVERRIDE;
EXEC sp_configure 'xp_cmdshell', 1
EXEC sp_configure 'CLR enabled', 1;
RECONFIGURE WITH OVERRIDE;
ALTER DATABASE ACS SET TRUSTWORTHY OFF
USE master
CREATE ASYMMETRIC KEY CLR_Key_Wrapper FROM EXECUTABLE FILE = 'C:\Wrapper.dll'
CREATE ASYMMETRIC KEY CLR_Key_BouncyCastle FROM EXECUTABLE FILE = 'C:\BouncyCastle.Crypto.dll'
CREATE LOGIN CLR_Login_Wrapper FROM ASYMMETRIC KEY CLR_Key_Wrapper
CREATE LOGIN CLR_Login_BouncyCastle FROM ASYMMETRIC KEY CLR_Key_BouncyCastle
GRANT UNSAFE ASSEMBLY TO CLR_Login_Wrapper
GRANT UNSAFE ASSEMBLY TO CLR_Login_BouncyCastle
USE ACS
CREATE ASSEMBLY CLR FROM 'C:\Wrapper.dll' WITH PERMISSION_SET = UNSAFE
GO
CREATE PROCEDURE Generate_Keypair
(
@BSI_or_NIST BIT,
@Private_Key VARBINARY(64) OUTPUT,
@Public_Key VARBINARY(128) OUTPUT
)
AS EXTERNAL NAME CLR.Wrapper.generateKeyPair
GO
CREATE PROCEDURE Sign_Data
(
@BSI_or_NIST BIT,
@Data VARBINARY(8000),
@Private_Key VARBINARY(64),
@Signature VARBINARY(128) OUTPUT
)
AS EXTERNAL NAME CLR.Wrapper.SignData
GO
CREATE PROCEDURE Verify_Data
(
@BSI_or_NIST BIT,
@Signature VARBINARY(128),
@Data VARBINARY(8000),
@Public_Key VARBINARY(128),
@OK BIT OUTPUT
)
AS EXTERNAL NAME CLR.Wrapper.VerifyData
现在,在TSQL批处理中使用三个过程Generate_Keypair,Sign_Data和Verify_Data,或者通过例如来自例如的程序调用。一个.Net客户端应用程序有时工作正常,但有时它会导致MSSQLSERVER服务在使用100%CPU时进入无限循环,特别是当我尝试将所有这些安装在与我自己开发代码的机器不同的机器上时以上(尽管如此,在我自己的机器上它也会发生,但不常见)。
唯一可以做的就是取消正在执行的查询并删除当CPU处于100%使用状态时需要很长时间的程序集。
谁能告诉我我做错了什么?提前谢谢,
扬
答案 0 :(得分:0)
您的存储过程声明了C#方法缺少的BIT参数。
要确定程序集是否导致100%的CPU使用率,您应该在代码执行时进行日志记录,并检查生成的日志文件(log4net,BareTail)。