SQL CLR хранимая процедура для шифрования - PullRequest
1 голос
/ 23 февраля 2011

Справочная информация: У меня есть пакет служб SSIS, который загружает данные профиля из системы A и создает соответствующие профили и пользователей членства в системе B. Система B использует настраиваемый поставщик членства ASP.NET, который должен иметь возможность расшифровыватьпароли, сгенерированные пакетом служб SSIS.Я создал хранимые процедуры CLR для генерации соли и шифрования, которые будут использоваться пакетом служб SSIS.

Проблема: Чтобы зашифрованные пароли были расшифрованы провайдером членства в ASP.NET, мне нужно установить MachineKey, используемый хранимыми процедурами CLR.Я понятия не имею, как это сделать, или если это вообще возможно.

Я использовал Reflector, чтобы извлечь требуемый код шифрования из библиотеки System.Membership.После небольшого рефакторинга это выглядит так:

private static byte[] PerformEncryption(byte[] input, bool encryptFlag)
{
    if (input == null)
        return null;

    byte[] inputBuf = input;
    byte[] outputBuf;

    try
    {
        using (MemoryStream targetStream = new MemoryStream())
        using (SymmetricAlgorithm algo = SymmetricAlgorithm.Create())
        using (ICryptoTransform cryptoTransform = CreateCryptoTransform(algo, encryptFlag))
        using (CryptoStream cryptoStream = new CryptoStream(targetStream, cryptoTransform, CryptoStreamMode.Write))
        {
            int start = 0;
            int length = input.Length;

            // Write the input buffer to the cryptoStream passing the byte stream through the cryptoTransform
            cryptoStream.Write(inputBuf, start, length);
            cryptoStream.FlushFinalBlock();
            outputBuf = targetStream.ToArray();
        }
    }
    catch (Exception ex)
    {
        throw new InvalidOperationException("Unable to " + (encryptFlag ? "en" : "de") + "crypt data. See inner exception for more detail.", ex);
    }
    return outputBuf;
}

Проблема в том, что SymmetricAlgorithm.Create() создает симметричный алгоритм по умолчанию с векторами инициализации, как определено в MachineKey.

Любая помощь приветствуется.Также, пожалуйста, дайте мне знать, если есть лучший / другой подход, который может быть проще.

Спасибо.

Ответы [ 2 ]

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

Я завел ключ в коде. Конечно, не лучшее решение, но оно сработало. В любом случае, я больше не использую этот метод. Я реализую совершенно другой сценарий.

0 голосов
/ 26 февраля 2011

В любом случае, примите во внимание это:

throw new InvalidOperationException(String.Format("Unable to {0}crypt data. See inner exception for more detail.", encryptFlag ? "en" : "de"), ex);

, что довольно читабельно. Не так ли?

И еще одна вещь - using блоки могут быть вложенными, поэтому дополнительный отступ не требуется.

...