如何在日志记录中隐藏密码

时间:2016-06-08 11:03:40

标签: c# string

我以这种方式打印命令行参数:

static void LogParameters(string[] args)
{
    Console.WriteLine("Command line parameters: {0}", string.Join(" ", args);
}

将打印-username=Scott -password=cafebabe -nofail。但我想把它打印成:

-username=Scott -password=******* -nofail

如果此参数的password=打印出星号,我该如何显示任何内容?

3 个答案:

答案 0 :(得分:3)

我看到两种显而易见的方法:

  1. 遍历您的args数组,手动查找密码参数并屏蔽密码
  2. 将参数合并到字符串中并使用正则表达式替换密码
  3. 我更喜欢第一个,使用LINQ:

    var argsForLogging = args
        .Select(arg => arg.StartsWith("-password=") ? "-password=(entered)" : arg);
    
    Console.WriteLine("Command line parameters: {0}", string.Join(" ", argsForLogging));
    

    它可能看起来不那么好,但它很容易阅读,并且没有正则表达式:)

    P.S。可以使代码输出不是(entered),而是输入密码中的字母。但是,它仍会披露非常敏感的信息。

    <强>更新 如果参数格式不严格,那么您需要考虑这一点 例如,如果它应该不区分大小写,那么您可能希望使用此方法:

    var argsForLogging = args
        .Select(arg => arg.Trim().StartsWith("-password=", true, CultureInfo.InvariantCulture) 
            ? "-password=(entered)" 
            : arg);
    
    Console.WriteLine("Command line parameters: {0}", string.Join(" ", argsForLogging));
    

答案 1 :(得分:1)

通常

String maskString = String.Empty;
    String replaceString = "-password=";
    foreach (var item in args)
    {
        if (item.IndexOf(replaceString) >= 0)
        {
            maskString += replaceString + "********* ";
        }
        else
        {
            maskString += item+" ";
        }
    }
    Console.WriteLine("Command line parameters: {0}", maskString.TrimEnd());

或LinQ

var argsForLogging = args
 .Select(arg => arg.StartsWith("-password=") ? "-password=*********" : arg);

 Console.WriteLine("Command line parameters: {0}", string.Join(" ", argsForLogging));

答案 2 :(得分:1)

static void LogParameters(string[] args)
{
    string msg = string.Empty;
    foreach(var item in args)
    {
        var subParts = item.Split(new[] { '=' },  
                       StringSplitOptions.RemoveEmptyEntries);
        if (subParts[0] != "-password")
            msg += item + " ";
        else
            msg += subParts[0] + "****** ";
    }
   Console.WriteLine("Command line parameters: {0}",msg.TrimEnd());
}