ここで長らくlurkerは私が見ていないという質問をしています。私はdotnetコアにc#コンソールアプリケーションを作成しており、ユーザーがパスワードを入力できるようにしようとしており、セキュリティ、特にメモリーダンプを心配しています。C#でパスワード入力をセキュリティで保護するdotnetコアコンソールアプリケーション
次のとおりです。Password masking console application私の理解は、文字列変数として格納されパスワードがメモリダンプ(reference)を介して公開することができることです。
通常、SecureStringはここに移動する方法ですが、dotnet coreではサポートされていないようです。
私は文字配列を使用するようにコードを修正しようとしました。これは、変更が不変ではないということであり、すべてが単一のメモリに格納されるわけではないからです。正直なところ、セキュリティは私の特権ではありませんが、私の質問は、以下のコードが適切にメモリダンプを通してパスワードを公開しないように保護しているかどうかです。
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は、そのコンテキストがどのくらい役立つかは不明でした。このアプリケーションの目的は、ADオブジェクトのリストをプルダウンするためにLDAPクエリを実行することです、私は接続をバインドするユーザー/パスを要求しています。個人的には資格情報を保存するよりもリスクを低くする/デバイス間を渡すことはリスクが低いと考えていますが、IT管理者が貴重な資格情報を使って実行する可能性があるため、ここでデューデリジェンスを行いたいと思っています。 – Polymergraphy