我是一个长期潜水的读者,终于有一个问题要问了。我正在使用dotnet core编写c#控制台应用程序,并尝试允许用户输入密码,但我担心安全性,特别是内存转储。
根据Password masking console application,我的理解是将密码存储为字符串变量可能会通过内存转储暴露 (参考链接)。
虽然SecureString通常是解决方法,但似乎不受dotnet core支持。
我试图修改代码以使用char数组,因为我有限的理解是它不是不可变的,所以不会全部存储在单个内存中。但是,由于安全性不是我的强项,所以我的问题是,下面的代码是否能够正确地保护我避免通过内存转储暴露密码?
Console.WriteLine("Enter pass");
char[] passwordArray = new char[256];
int whileIndex = 0;
while (true)
{
ConsoleKeyInfo key = Console.ReadKey(true);
if (key.Key == ConsoleKey.Enter)
{
break;
}
else if (key.Key == ConsoleKey.Backspace)
{
if (whileIndex != 0) //so it doesn't explode if someone holds backspace
{
whileIndex--;
}
}
else
{
passwordArray[whileIndex] = key.KeyChar;
whileIndex++;
}
}
//Truncate array to length of password
var endIndex = Array.IndexOf(passwordArray,'\0');
char[] shortenedPasswordArray = new char[endIndex];
Array.Copy(passwordArray, shortenedPasswordArray, endIndex);
//Authentication code here
//Wipe the characters when done
foreach(var passChar in passwordArray)
{
passwordArray[passChar] = '\0';
}
foreach (var passChar in shortenedPasswordArray)
{
shortenedPasswordArray[passChar] = '\0';
}