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
如何使任何内容显示在
密码=
之后,因为此参数用星号打印?我看到两种明显的方法:
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));
我认为有两种明显的方法可以做到这一点:
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
适合我!