Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在日志中隐藏密码_C#_String - Fatal编程技术网

C# 如何在日志中隐藏密码

C# 如何在日志中隐藏密码,c#,string,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 如何使任何内容显示在密码=

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

static void LogParameters(string[] args)
{
    Console.WriteLine("Command line parameters: {0}", string.Join(" ", args);
}
它将打印
-username=Scott-password=cafebabe-nofail
。但我想将其打印为:

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

如何使任何内容显示在
密码=
之后,因为此参数用星号打印?

我看到两种明显的方法:

  • 遍历args数组,手动查找密码参数并屏蔽密码
  • 将参数组合成字符串并使用正则表达式替换密码
  • 我更喜欢第一个,使用LINQ:

    var argsForLogging = args
        .Select(arg => arg.StartsWith("-password=") ? "-password=(entered)" : arg);
    
    Console.WriteLine("Command line parameters: {0}", string.Join(" ", argsForLogging));
    
    它看起来可能不太好,但易于阅读,并且没有正则表达式:)

    注意:可以使代码输出不是
    (输入)
    ,而是尽可能多的星号和密码中的字母。但是,它仍然会披露非常敏感的信息

    更新: 如果参数格式不严格,则需要考虑这一点。
    例如,如果它不区分大小写,那么您可能希望使用以下方法:

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

    我认为有两种明显的方法可以做到这一点:

  • 遍历args数组,手动查找密码参数并屏蔽密码
  • 将参数组合成字符串并使用正则表达式替换密码
  • 我更喜欢第一个,使用LINQ:

    var argsForLogging = args
        .Select(arg => arg.StartsWith("-password=") ? "-password=(entered)" : arg);
    
    Console.WriteLine("Command line parameters: {0}", string.Join(" ", argsForLogging));
    
    它看起来可能不太好,但易于阅读,并且没有正则表达式:)

    注意:可以使代码输出不是
    (输入)
    ,而是尽可能多的星号和密码中的字母。但是,它仍然会披露非常敏感的信息

    更新: 如果参数格式不严格,则需要考虑这一点。
    例如,如果它不区分大小写,那么您可能希望使用以下方法:

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

    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());
    
    还是林克

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

    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());
    
    还是林克

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

    通过命令行获取密码(用户不输入密码)是不安全的。它可能不会显示在程序的日志中,但会显示内存,也会显示在调用应用程序的脚本的日志中。这对你来说可能是个问题,也可能不是,但我想我应该提一下,因为你正在努力使你的应用程序更安全。这是用于Windows服务安装的。就像我们可以使用用户名和密码(使用
    services.msc
    )设置服务一样,此应用程序将设置服务。不能透露更多。不用担心保密的事情,我不会打听的。如果您的应用程序可以(在交互模式下)提示用户输入密码,并在无人值守模式下尝试输入密码时警告用户,这可能仍然值得考虑。如果您可以让他们使用所需的用户令牌运行您的程序,您也可以避免自己处理密码。我已经有好几年没有跳过window的圈套了,尤其是服务和安装程序,所以你将比我更有能力解决这个难题:)谢谢你的积极评论和批评!但我无法控制这一切。这必须使用批处理脚本以非交互模式安装。通过命令行获取密码(用户不键入密码)是不安全的。它可能不会显示在程序的日志中,但会显示内存,也会显示在调用应用程序的脚本的日志中。这对你来说可能是个问题,也可能不是,但我想我应该提一下,因为你正在努力使你的应用程序更安全。这是用于Windows服务安装的。就像我们可以使用用户名和密码(使用
    services.msc
    )设置服务一样,此应用程序将设置服务。不能透露更多。不用担心保密的事情,我不会打听的。如果您的应用程序可以(在交互模式下)提示用户输入密码,并在无人值守模式下尝试输入密码时警告用户,这可能仍然值得考虑。如果您可以让他们使用所需的用户令牌运行您的程序,您也可以避免自己处理密码。我已经有好几年没有跳过window的圈套了,尤其是服务和安装程序,所以你将比我更有能力解决这个难题:)谢谢你的积极评论和批评!但我无法控制这一切。必须使用批处理脚本以非交互模式安装。为什么要使用
    replaceString
    ?为什么我不能使用
    -password=*******
    ?replaceString是令牌名称。为什么使用
    replaceString
    ?为什么我不能使用
    -password=******
    ?replaceString是令牌名。非常好。我是否可以不敏感地使用案例执行启动?谢谢。我想
    StringComparison.ordinallingorecase
    适合我!好极了。我是否可以不敏感地使用案例执行启动?谢谢。我想
    StringComparison.ordinallingorecase
    适合我!