2013-01-04 24 views
-1

可能重複加密:
Base64 encoding in SQL Server 2005 T-SQL如何使用相同的算法中的數據在SQL

我有這樣的加密數據的.NET程序。

public static string EncryptStringAES(string plainMessage) 
{ 
    string strmsg = string.Empty; 
    try 
    { 
     byte[] encode = new byte[plainMessage.Length]; 
     encode = Encoding.UTF8.GetBytes(plainMessage); 
     strmsg = Convert.ToBase64String(encode); 
    } 
    catch (Exception ex) 
    { 
    } 
    return strmsg; 
} 

我喜歡在SQL Server中實現相同的加密。這可能在SQL Server中獲得相同的加密。

+5

你意識到base64編碼不是真正的加密,不應該依賴任何遠程敏感的東西,對吧? – akton

+0

這不是它正在編碼的加密。更新問題或關閉它。 – Namphibian

+0

感謝大家.. !!! – Ashish

回答

1

您需要採取多個步驟才能做到您想要的。首先,如果你可以找到那些使用你在C#代碼中使用的相同加密算法的東西,那麼你應該只使用現有的庫(確保它是一個安全的實現)。下面的答案會讓你想要去的地方,但是請確保將salt的值更改爲可以使用的隨機鹽,和/或查找如何在不使用Rfc2898DeriveBytes類的情況下傳入IV和密鑰。

首先,您需要一個可以進行加密的類,這個類可以用在您的.net代碼所在的項目中,也可以用於在SQL Server上創建的項目。

internal class AES 
{ 
    static readonly byte[] u8_Salt = new byte[] { 0x26, 0x19, 0x81, 0x4E, 0xA0, 0x6D, 0x95, 0x34, 0x26, 0x75, 0x64, 0x05, 0xF6 }; 

    public static string EncryptString(string plainText, string password) 
    { 
     Rfc2898DeriveBytes pdb = new Rfc2898DeriveBytes(password, u8_Salt); 
     using (RijndaelManaged i_Alg = new RijndaelManaged { Key = pdb.GetBytes(32), IV = pdb.GetBytes(16) }) 
     { 
      using (var memoryStream = new MemoryStream()) 
      using (var cryptoStream = new CryptoStream(memoryStream, i_Alg.CreateEncryptor(), CryptoStreamMode.Write)) 
      { 
       byte[] data = Encoding.UTF8.GetBytes(plainText); 
       cryptoStream.Write(data, 0, data.Length); 
       cryptoStream.FlushFinalBlock(); 

       return Convert.ToBase64String(memoryStream.GetBuffer(), 0, (int)memoryStream.Length); 
      } 
     } 
    } 

    public static string Decrypt(string cipherText, string password) 
    { 
     Rfc2898DeriveBytes pdb = new Rfc2898DeriveBytes(password, u8_Salt); 

     using (RijndaelManaged i_Alg = new RijndaelManaged { Padding = PaddingMode.Zeros, Key = pdb.GetBytes(32), IV = pdb.GetBytes(16) }) 
     { 
      using (var memoryStream = new MemoryStream()) 
      { 
       using (var cryptoStream = new CryptoStream(memoryStream, i_Alg.CreateDecryptor(), CryptoStreamMode.Write)) 
       { 
        byte[] data = Convert.FromBase64String(cipherText); 
        cryptoStream.Write(data, 0, data.Length); 
        cryptoStream.Flush(); 

        return Encoding.UTF8.GetString(memoryStream.ToArray()); 
       } 
      } 
     } 
    } 
} 

接下來,您將需要爲SQL Server創建CLR類。這是一個相當簡單的過程,只需創建一個新項目並將該類添加到您的項目中即可。創建項目後,添加一個新的類來包裝加密類。

public class AESManagedProc 
{ 
    [Microsoft.SqlServer.Server.SqlFunction] 
    public static string Encrypt(string plainText, string password) 
    { 
     return AES.EncryptString(plainText, password); 
    } 

    [Microsoft.SqlServer.Server.SqlFunction] 
    public static string Decrypt(string cipherText, string password) 
    { 
     return AES.Decrypt(cipherText, password); 
    } 
} 

你的項目應該是現在這個樣子 Project file list

下一步是讓它在SQL Server中。您需要首先確保CLR是在SQL Server中啓用,因此使其能夠使用主數據庫並執行以下操作:

sp_configure 'clr enabled', 1; 
GO 
RECONFIGURE; 
GO 

下一頁創建裝配

CREATE ASSEMBLY AESEncryption FROM 'C:\PATH_TO_YOUR_DLL\SqlExtensions.dll' WITH PERMISSION_SET = SAFE; 

最後創建兩個包裝函數,一個用於加密,一個用於解密:

CREATE FUNCTION EncryptString 
(
    @plainText nvarchar(max), @password nvarchar(max) 
) 
RETURNS nvarchar(max) 
AS 
    EXTERNAL NAME AESEncryption.[SqlExtensions.AESManagedProc].Encrypt 

GO 

CREATE FUNCTION DecryptString 
(
    @cipherText nvarchar(max), @password nvarchar(max) 
) 
RETURNS nvarchar(max) 
AS 
    EXTERNAL NAME AESEncryption.[SqlExtensions.AESManagedProc].Decrypt 
GO 

現在到SQL Server,你只需要調用加密/解密功能上進行加密。

SELECT dbo.EncryptString('test','test'); 
SELECT dbo.DecryptString(dbo.EncryptString('test','test'), 'test'); 

Desclaimer確保你沒有我給你的代碼中使用u8_salt值,該值是遍佈例子互聯網。其次確保您的密碼存儲在安全的地方。選擇你的密碼非常wisley它將被用來生成你的密鑰,所以它是一個安全的選擇是很重要的。

相關問題