-1

重複の可能性:
SQL Server 2005 T-SQL の Base64 エンコーディング

このようなデータを暗号化する .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 で同じ暗号化を取得することは可能ですか。

4

1 に答える 1

1

やりたいことを実行するには、いくつかの手順を実行する必要があります。まず、C# コードで使用しているのと同じ暗号化アルゴリズムを使用するものを見つけることができた場合は、既存のライブラリを使用する必要があります (とにかく、それが安全な実装であることを確認してください)。次の回答で目的の場所に移動できますが、使用できるランダムなソルトにソルト値を変更するか、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 サーバーで有効になっていることを確認する必要があります。有効にするには、master データベースを使用して、次の手順を実行します。

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

次にアセンブリを作成します

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

最後に、暗号化用と復号化用の 2 つのラッパー関数を作成します。

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');

免責事項 私が提供したコードでu8_salt値を使用しないように注意してください。その値は、例ではインターネット全体にあります。次に、パスワードが安全な場所に保管されていることを確認してください。パスワードは非常に賢明に選択してください。これはキーの生成に使用されるため、安全な選択であることが重要です。

于 2013-01-04T20:07:45.343 に答える