1

Nlog には、ログをデータベースに書き込む機能があります。
これを行うには、nlog 構成または Web 構成でユーザー/パスを指定する必要があります。

暗号化する方法はありますか?

4

1 に答える 1

1

Encrypting Passwords in a .NET app.config File をご覧ください。

次のクラスをプロジェクトに追加します。

class Encryption
{
    static byte[] entropy = System.Text.Encoding.Unicode.GetBytes("Add some entropy");

    public static string EncryptString(System.Security.SecureString input)
    {
        byte[] encryptedData = System.Security.Cryptography.ProtectedData.Protect(
            System.Text.Encoding.Unicode.GetBytes(ToInsecureString(input)),
            entropy,
            System.Security.Cryptography.DataProtectionScope.CurrentUser);
        return Convert.ToBase64String(encryptedData);
    }

    public static SecureString DecryptString(string encryptedData)
    {
        try
        {
            byte[] decryptedData = System.Security.Cryptography.ProtectedData.Unprotect(
                Convert.FromBase64String(encryptedData),
                entropy,
                System.Security.Cryptography.DataProtectionScope.CurrentUser);
            return ToSecureString(System.Text.Encoding.Unicode.GetString(decryptedData));
        }
        catch
        {
            return new SecureString();
        }
    }

    public static SecureString ToSecureString(string input)
    {
        SecureString secure = new SecureString();
        foreach (char c in input)
        {
            secure.AppendChar(c);
        }
        secure.MakeReadOnly();
        return secure;
    }

    public static string ToInsecureString(SecureString input)
    {
        string returnValue = string.Empty;
        IntPtr ptr = System.Runtime.InteropServices.Marshal.SecureStringToBSTR(input);
        try
        {
            returnValue = System.Runtime.InteropServices.Marshal.PtrToStringBSTR(ptr);
        }
        finally
        {
            System.Runtime.InteropServices.Marshal.ZeroFreeBSTR(ptr);
        }
        return returnValue;
    }
}

次の構文を使用して、暗号化されたパスワード文字列を取得します。

var encryptedPassword = Encryption.EncryptString(
    Encryption.ToSecureString("yourPassword"));

encryptedPassword設定ファイルで、クリア パスワードをデータベース ターゲットの内容に置き換えてください。

<target xsi:type="Database"
  name="d1"
  dbUserName="log"
  dbProvider="System.Data.SqlClient"
  dbDatabase="NLog"
  dbPassword="AQAAA... + the rest of the encryptedPassword string"
  dbHost="TheLogServer"
  commandText="INSERT INTO [LOG] VALUES (@p)">
  <parameter layout="${longdate}|${level:uppercase=true}|${logger}|${message}" name="p" />
</target>

現在のクラス ロガーのを置き換えDBPassword、復号化されたパスワードでロガーを返すメソッドを作成します。

static Logger logger = GetLogger();

private static Logger GetLogger()
{
    var logger = LogManager.GetCurrentClassLogger();
    var d1 = (DatabaseTarget)logger.Factory.Configuration
        .AllTargets.Where(t => t.Name == "d1").FirstOrDefault();
    d1.DBPassword = Encryption.ToInsecureString(
        Encryption.DecryptString(((NLog.Layouts.SimpleLayout)(d1.DBPassword)).Text));
    return logger;
}

今までと同じようにロガーを使用します。

static void Main(string[] args)
{
    LogEventInfo myEvent = new LogEventInfo(LogLevel.Debug, "", "My debug message");
    myEvent.LoggerName = logger.Name;
    myEvent.Properties.Add("MyCustomValue", "This is from MyClass");
    logger.Log(myEvent);
}
于 2013-02-26T14:23:27.650 に答える