簡體   English   中英

C#4.0 / Sql Server 2008:業務層中的加密/解密

[英]C# 4.0 / Sql Server 2008: Encrypt/decrypt in business layer

我在這里只需要一些建議。 我需要保護一些列數據,因此我一直在搜尋有關C#4.0 / Sql Server 2008 (而非R2)中的加密的信息。

這可能是我需要的:

“必須保護數據免受系統管理員的侵害。實際上,在這種情況下,最好不要使用SQL Server內部加密,而最好僅依靠中間層來執行加密和解密。要保護您的數據庫非常困難。如果您的密鑰存儲在SQL Server中,則來自確定的系統管理員的數據。” 資料來源: msdn

正確的方法是什么?

我試圖將用Rijndael加密的數據保存到數據庫中。

我收到錯誤消息: Length of the data to decrypt is invalid

我還沒有用谷歌搜索。

我應該繼續為此奮斗還是應該嘗試使用CLR解決此問題? 我只是找不到一個教程,該教程向我展示了如何在業務層中進行加密/解密。

有什么建議么?

謝謝

編輯:

好的,這是我到目前為止所擁有的。 如前所示,數據已使用Rinjdael加密。 它存儲在列中

TestCrypt (varbinary(255), null)

我在數據庫中看起來像這樣:

0xF6CA99F5B6BFA1D9A0BD2381177E049E02F381078966195B68A54A5BEC4C

使用sp檢索它,例如:

SELECT cast(s.TestCrypt AS varbinary) AS TestCrypt

並在數據訪問層中:

while (reader.Read())
{
    data.TestCrypt = (byte[])reader["TestCrypt"];
}

在此行的DecryptStringFromBytes中發現錯誤

plaintext = srDecrypt.ReadToEnd();

錯誤:要解密的數據長度無效。

至於在業務層中使用加密和解密,我更喜歡使用以下加密和解密方法:

#region Encryption Decription
public class CryptorEngine
{
/// <summary>
/// Encrypt a string using dual encryption method. Return a encrypted cipher Text
/// </summary>
/// <param name="toEncrypt">string to be encrypted</param>
/// <param name="useHashing">use hashing? send to for extra security</param>
/// <returns></returns>
public static string Encrypt(string toEncrypt, bool useHashing)
{
    try
    {
        byte[] keyArray;
        byte[] toEncryptArray = UTF8Encoding.UTF8.GetBytes(toEncrypt);

        System.Configuration.AppSettingsReader settingsReader = new AppSettingsReader();
        // Get the key from config file
        string key = (string)settingsReader.GetValue("SecurityKey", typeof(String));
        //System.Windows.Forms.MessageBox.Show(key);
        if (useHashing)
        {
            MD5CryptoServiceProvider hashmd5 = new MD5CryptoServiceProvider();
            keyArray = hashmd5.ComputeHash(UTF8Encoding.UTF8.GetBytes(key));
            hashmd5.Clear();
        }
        else
            keyArray = UTF8Encoding.UTF8.GetBytes(key);

        TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();
        tdes.Key = keyArray;
        tdes.Mode = CipherMode.ECB;
        tdes.Padding = PaddingMode.PKCS7;

        ICryptoTransform cTransform = tdes.CreateEncryptor();
        byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
        tdes.Clear();
        return Convert.ToBase64String(resultArray, 0, resultArray.Length);
    }
    catch (Exception ex)
    {
        return "Invalid";   
    }
}
/// <summary>
/// DeCrypt a string using dual encryption method. Return a DeCrypted clear string
/// </summary>
/// <param name="cipherString">encrypted string</param>
/// <param name="useHashing">Did you use hashing to encrypt this data? pass true is yes</param>
/// <returns></returns>
public static string Decrypt(string cipherString, bool useHashing)
{
    try
    {
        if (string.IsNullOrEmpty(cipherString))
            return "";
        byte[] keyArray;
        byte[] toEncryptArray = Convert.FromBase64String(cipherString);

        System.Configuration.AppSettingsReader settingsReader = new AppSettingsReader();
        //Get your key from config file to open the lock!
        string key = (string)settingsReader.GetValue("SecurityKey", typeof(String));

        if (useHashing)
        {
            MD5CryptoServiceProvider hashmd5 = new MD5CryptoServiceProvider();
            keyArray = hashmd5.ComputeHash(UTF8Encoding.UTF8.GetBytes(key));
            hashmd5.Clear();
        }
        else
            keyArray = UTF8Encoding.UTF8.GetBytes(key);

        TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();
        tdes.Key = keyArray;
        tdes.Mode = CipherMode.ECB;
        tdes.Padding = PaddingMode.PKCS7;

        ICryptoTransform cTransform = tdes.CreateDecryptor();
        byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);

        tdes.Clear();
        return UTF8Encoding.UTF8.GetString(resultArray);
    }
    catch (Exception ex)
    {
       return "Invalid";   
    }
}
}
#endregion

使用所需的任何加密提供程序在.net中加密數據,並將其存儲在具有正確長度的VARBINARY數據類型的列中。

其余的將數據與所有其他數據相同。

SELECT cast(s.TestCrypt AS varbinary) AS TestCrypt

該行將TestCrypt的值截斷為30個字節

在數據定義或變量聲明語句中未指定n時,默認長度為1。在CAST函數中未指定nis時,默認長度為30。

嘗試:

SELECT cast(s.TestCrypt AS varbinary(255)) AS TestCrypt

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM