我有一个场景,必须向 C#.NET 程序提供从用户名/密码组合派生的机密。此机密是不可逆的(将其视为哈希),但要求只能使用 .NET 库创建该机密。
这里的问题是,实际包含用户名/密码的程序与需要秘密的程序不同,并且不是 .NET 程序,因此必须通过某些 IPC 发送信息。
值得注意的是,只要用户登录,程序的用户名/密码就会将它们保留在内存中。我意识到这本身非常不安全,但我无法更改它。
我正在寻找一种让 C#.NET 程序尽可能安全地获取秘密的方法。
我提出的两个选项是使用命名管道将用户名/密码直接从一个应用程序传输到另一个应用程序,或者使用 COM 组件,以便第一个应用程序可以将用户名/密码发送到 COM 组件,该组件可以计算并将其写入稍后可由第二个应用程序读取的位置。
对于命名管道方法,我希望凭证请求组件如下所示
using (var a = new NamedPipeClientStream(".", pipeName, PipeDirection.InOut, PipeOptions.Asynchronous, TokenImpersonationLevel.Impersonation))
{
var requestString = new StreamString(a);
var credString = new StreamString(a);
await a.ConnectAsync();
a.ReadMode = PipeTransmissionMode.Message;
requestString.WriteString(JsonConvert.SerializeObject(new CredentialRequest()));
var cred = JsonConvert.DeserializeObject<Credential>(credString.ReadString());
var secret = await CreateSecret(cred.Username, cred.Password);
a.Close();
}
Run Code Online (Sandbox Code Playgroud)
基于此,管道的另一侧应该非常明显。
对于 COM 解决方案,我想我会创建一个具有以下方法的对象
public void ComputeAndStoreSecret(string username, string password)
{
var secret = CreateSecret(username, password);
using (var applicationStorageFileForUser = …Run Code Online (Sandbox Code Playgroud)