2014-09-12 141 views
0

我们必须在SQL Server级别对用户ID进行加密,然后通过查询字符串将此加密值传递给C#,一旦C#读取它,它需要解密(调用SQL服务器功能来实现这一点)。数据库加密和数据库解密使用C#代码

我们的加密技术不一定非常强大,所以我们决定使用EncryptByPassPhraseDecryptByPassPhrase

但是,我无法将解密的值从C#传递到SQL Server函数,以便我找回解密的字符串。

SQL Server的功能:

调用解密函数
CREATE FUNCTION [dbo].[ufn_DecryptString] 
    (@EncryptedString VARBINARY(200)) 
RETURNS VARCHAR(200) 
AS 
BEGIN 
    DECLARE @RetValue VARCHAR(200) 
    DECLARE @PassPhrase varchar(200) = 'key' 

    SET @RetValue = DecryptByPassPhrase(@PassPhrase, @EncryptedString)  

    RETURN @RetValue 
END 

C#代码:

object decryptedUserId = 0;    
    byte[] newByte = StrToByteArray(encryptedUserId); 

    var conn = new SqlConnection(CONN_STRING); 
    const string query = "select dbo.ufn_DecryptString(@EncryptedString);"; 

    conn.Open(); 

    var cmd = new SqlCommand(query, conn); 
    cmd.Parameters.Add("@EncryptedString", SqlDbType.VarBinary).Value = newByte; 

    decryptedUserId = cmd.ExecuteScalar();  

    conn.Close(); 

    return decryptedUserId; 

    private static byte[] StrToByteArray(string strValue) 
    { 
     System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding(); 
     return encoding.GetBytes(strValue); 
    } 

我不断收到一个空白对象decryptedUserId当我执行的代码。

回答

0

ExecuteScalar返回第一个表的第一行的第一个单元格。你RETURN @RetValue,而不是SELECT @RetValue有第一个表的第一行的第一个单元格 - 或者,你可以通过一个OUTPUT参数设置它。

+0

谢谢,这有助于解决一半的问题,但是,无论何时我通过转换为byte []将编码的字符串传递给SQL,似乎从上述代码看来,编码的字符串在SQL中对其进行配置时不会保持不变,任何想法为什么? – 2014-09-12 19:12:46

+0

您是否试过指定参数的长度,即'cmd.Parameters.Add(“@ EncryptedString”,SqlDbType.VarBinary,200).Value = newByte' – 2014-09-12 19:57:01