Использование CREATEd ASSEMBLY приводит к постоянному зависанию SQL Server - PullRequest
2 голосов
/ 30 марта 2011

это немного сложно объяснить, особенно для не носителей английского языка:

Я хочу использовать некоторые функции цифровой подписи на основе эллиптических кривых реализации C # криптотеки BouncyCastle . Я написал небольшой класс-оболочку 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 в качестве ресурса и только что созданным файлом ключа.

В 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  

Теперь, используя три процедуры Generate_Keypair, Sign_Data и Verify_Data в пакете TSQL или с помощью вызова процедуры, например, клиентское приложение .Net иногда работает нормально, но иногда это приводит к тому, что служба MSSQLSERVER заходит в нечто вроде бесконечного цикла при использовании 100% ЦП, особенно когда я пытаюсь установить все это на другую машину, чем моя собственная, где я разработал код выше (тем не менее, на моей собственной машине это бывает тоже, но реже).

Единственное, что можно сделать, - это отменить выполняющийся запрос и отбросить сборку, которая занимает довольно много времени, когда процессор используется на 100%.

Может кто-нибудь сказать мне, что я сделал не так? Заранее спасибо,
Jan

1 Ответ

0 голосов
/ 30 марта 2011

Ваши хранимые процедуры объявляют параметр BIT, которого нет в методах C #.

Чтобы выяснить, вызывают ли ваши сборки загрузку процессора на 100%, вы должны регистрироваться при каждом выполнении кода и проверять сгенерированный файл журнала (log4net, BareTail).

...