解密数据从SQL Server 2008 R2

本文关键字:2008 R2 Server SQL 数据 解密 | 更新日期: 2023-09-27 18:14:06

我需要一些帮助来翻译这个过程(见下文)到实体框架4.0。谁有什么建议,如何移植这个。目标项目包括:Silverlight 4, WCF RIA Services, 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());
    }

请让我知道我应该如何设置这个,谢谢!

解密数据从SQL Server 2008 R2

您可以通过实体框架运行查询,并通过使用ObjectContext.ExecuteStoreQuery<>()函数获得强类型结果(参见本例)。

然而,不幸的是,我不认为有任何方法可以避免自己生成T-SQL语句。虽然您可以通过sqlfunctions类在Linq-to-Entities查询中使用许多SQL Server的函数,但是没有函数可以转换SQL Server的DECRYPTBYKEY函数,更不用说实体框架不会生成打开键的语句了。

要在查询敏感数据之前解密,您所需要做的就是在EF ObjectContext连接中使用DbTransaction。

  • connection.Open ();
  • connection.BeginTransaction ();
  • 执行您的"打开"的命令或存储过程执行您的敏感数据查询,存储程序等。
  • 如果需要,提交或回滚事务

这迫使EF保持相同的db连接,因为你已经启动了一个db事务,这是有意义的,因为你可能会执行一大堆的SP作为同一个db事务的一部分。