2011-03-30 88 views
2

這一個有點難以解釋,尤其是對非英語母語者:使用創建的程序集導致SQL Server永久掛

我想用C#的一些橢圓曲線爲基礎的數字簽名功能執行BouncyCastle crypto library。我寫的有以下幾種方法小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 

現在,使用在T-SQL批處理或通過從例如一個過程調用三個程序Generate_Keypair,Sign_Data和Verify_Data .Net客戶端應用程序有時可以正常工作,但有時它會導致MSSQLSERVER服務在使用100%CPU時陷入無盡循環,尤其是當我嘗試將所有這些安裝在與我自己開發的代碼不同的機器上時上面(不過,在我自己的機器上它也發生了,但不太經常)。

可以做的唯一事情就是取消正在執行的查詢,並在CPU處於100%使用狀態時放下需要很長時間的程序集。

有誰能告訴我我做錯了什麼嗎?在此先感謝,
Jan

回答

0

您的存儲過程聲明CIT方法缺少的BIT參數。

要確定您的程序集是否導致100%的CPU使用率,應該在代碼執行時進行記錄,並檢查生成的日誌文件(log4net,BareTail)。