2014-09-12 138 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