Расшифровать данные из SQL Server 2008 R2

Мне нужна помощь в переводе этой процедуры (см. ниже) на Entity Framework 4.0. У кого-нибудь есть какие-либо предложения о том, как портировать это. Целевой проект включает в себя; Silverlight 4, службы RIA WCF, EF 4.0, SQL Server 2008 R2.

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

    Try 
    {
        SqlCommand cmd = new SqlCommand();
        cmd.Connection = cn;
        cmd.CommandType = CommandType.Text;
        string sql = "OPEN SYMMETRIC KEY " + this._encryptKey;
        sql += " DECRYPTION BY CERTIFICATE " + this._encrpytCert; 
        sql += " SELECT TOP (1) CONVERT(nvarchar(50),DECRYPTBYKEY(Field1)) AS Name";
        sql += " FROM Table3"; 
        sql += " ORDER BY CONVERT(nvarchar(50),DECRYPTBYKEY(Field1))";
        cmd.CommandText = sql;
        Name = (String)cmd.ExecuteScalar();
        bRtn = false;
    }
        catch (Exception ex)
    {
        System.Diagnostics.Debug.Print(ex.ToString());
    }

Пожалуйста, дайте мне знать, как мне это настроить, и спасибо!


person Dave Navarro    schedule 08.11.2011    source источник
comment
Ой, простите. Я не знал, что кричу. Я здесь новенький. Если вы расскажете мне, пожалуйста, как я кричал, я постараюсь больше этого не делать. Спасибо!   -  person Dave Navarro    schedule 09.11.2011
comment
все заглавные буквы в названии - я отредактировал это для вас. у меня нет хороших советов для вашего ответа, кроме того, что я не уверен, почему вы можете использовать хранимую процедуру.   -  person Jason    schedule 09.11.2011
comment
Хорошо спасибо. В следующий раз я буду использовать правильный регистр в теме. Что касается использования sprocs; по дополнительным соображениям безопасности мы хотим сохранить код, который обращается к таблицам данных, за пределами базы данных, чтобы, если база данных была просмотрена кем-то неавторизованным, они не знали, какие таблицы и ключи используются для предоставления данных. Невозможно «отобразить обратно», просмотрев sprocs. В очередной раз благодарим за помощь.   -  person Dave Navarro    schedule 09.11.2011
comment
Попробуйте посмотреть на codingheadache.com/?tag=entity-framework. Надеюсь, поможет.   -  person Richard Schneider    schedule 09.11.2011
comment
Здравствуйте, спасибо за ответ. Ссылка, безусловно, содержит много полезной информации, но чего ей не хватает, так это того, как перевести/реплицировать текст команды; cmd.CommandType = CommandType.Text; строка sql = ОТКРЫТЫЙ СИММЕТРИЧНЫЙ КЛЮЧ + this._encryptKey; sql += РАСШИФРОВКА ПО СЕРТИФИКАТУ + this._encrpytCert; Мне не удалось найти примеры написания кода T-SQL в классе доменных служб, который обрабатывает ключ дешифрования, как показано выше. Пожалуйста, дайте мне знать, если вы видели какие-либо примеры, демонстрирующие, как реализовать подобный код. Спасибо! ~ Дэйв   -  person Dave Navarro    schedule 09.11.2011
comment
Здравствуйте, еще раз спасибо за ответы и ссылки. Мне удалось заставить что-то работать, однако я действительно удивлен, что это работает, потому что это кажется очень примитивным. Поскольку данные доступны только для чтения, и мне нужно получить их только один раз (когда пользователь входит в приложение). Я понял, что все еще могу использовать команды T-SQL в своем методе... поэтому я так и сделал. Вот ссылка на другой пост на форуме, в котором показаны подробности; forums.silverlight.net/p/242102/ 604401.aspx/ Еще раз спасибо за ответы! ~ Дэйв   -  person Dave Navarro    schedule 10.11.2011


Ответы (2)


Вы можете выполнить запрос через Entity Framework и получить строго типизированные результаты, используя файл ObjectContext.ExecuteStoreQuery<>() (см. этот пример).

Однако, к сожалению, я не думаю, что есть какой-либо способ обойти необходимость самостоятельно генерировать оператор T-SQL. Хотя вы можете использовать многие функции SQL Server в запросах Linq-to-Entities через SqlFuntions, нет функции, которая транслирует функцию DECRYPTBYKEY SQL Server, не говоря уже о том, что Entity Framework не будет генерировать инструкцию для открытия ключа.

person Ryan    schedule 16.03.2013

Чтобы расшифровать перед запросом конфиденциальных данных, все, что вам нужно сделать, это использовать DbTransaction в соединении EF ObjectContext.

I.e.

  • соединение.Открыть();
  • соединение.НачалоТранзакции();
  • выполнить команду «OPEN SYMMETRIC KEY...» или хранимую процедуру с помощью ExecuteStoreCommand и выполнить запросы конфиденциальных данных, хранимые процедуры и т. д.
  • При необходимости зафиксируйте или откатите транзакцию

Это заставляет EF поддерживать одно и то же соединение с базой данных, потому что вы начали транзакцию с базой данных, и это имеет смысл, поскольку вы можете выполнить целую кучу SP как часть одной и той же транзакции с базой данных.

person Thyago    schedule 19.06.2014