這一個有點難以解釋,尤其是對非英語母語者:使用創建的程序集導致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