【发布时间】:2017-09-10 02:24:02
【问题描述】:
在这里潜伏了很久终于有一个我没有看到的问题。我正在 dotnet core 中编写一个 c# 控制台应用程序并尝试允许用户输入密码,并且担心安全性,尤其是内存转储。
以下内容:Password masking console application 我的理解是,存储为字符串变量的密码可以通过内存转储公开 (reference)。
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';
}
【问题讨论】:
-
AFAIK 数组仍然会被分配连续的内存空间,
-
您的威胁模型是什么?谁在做什么?
-
@NeilMcGuigan 不确定该上下文有多大帮助。此应用程序的目的是运行 LDAP 查询以下拉 AD 对象列表,并且我请求用户/通行证绑定连接。虽然我个人认为它比保存凭据/在设备之间传递它们的风险更低,但它可能由具有有价值凭据的 IT 管理员执行,所以我想在这里做我的尽职调查。
-
谁会进行攻击?他们在哪里?
-
@NeilMcGuigan 如果我从另一个方向开始说这个可能会更容易。如果这是一个 .NET Standard 应用程序,我会在这里使用 SecureString 并称之为一天,所以我们可以将其重新表述为:上面的代码引入了多少额外的风险而不是使用 SecureString?据我所知,最大的区别是 SecureString 在内存中加密,这使得它更能防止内存转储。我离开这里了吗?如果不重新创建 SecureString,这种风险是否不可避免?
标签: c# security .net-core securestring