您需要採取多個步驟才能做到您想要的。首先,如果你可以找到那些使用你在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);
}
}
你的項目應該是現在這個樣子
下一步是讓它在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它將被用來生成你的密鑰,所以它是一個安全的選擇是很重要的。
你意識到base64編碼不是真正的加密,不應該依賴任何遠程敏感的東西,對吧? – akton
這不是它正在編碼的加密。更新問題或關閉它。 – Namphibian
感謝大家.. !!! – Ashish