用于共享敏感信息的安全进程间通信

Isa*_*ais 5 .net c# security ipc named-pipes

我有一个场景,必须向 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 = IsolatedStorageFile.GetUserStoreForAssembly())
        {
            using (var applicationStorageStreamForUser = new IsolatedStorageFileStream("secret_store.txt", FileMode.Create, applicationStorageFileForUser))
            {
                using (StreamWriter sw = new StreamWriter(applicationStorageStreamForUser))
                {
                    sw.WriteLine(secret);
                }
            }
        }

    }
Run Code Online (Sandbox Code Playgroud)

还有一个 COM 组件从该存储位置读取并返回秘密。

我基本上是在寻找关于为什么我想要使用其中一种技术而不是另一种技术的任何见解,或者可能考虑任何其他选项(RPC、邮箱等)

我发现/考虑的一些事情

  • 命名管道解决方案容易受到管道抢注的影响
  • 命名管道需要用户名/密码才能离开第一个应用程序的进程空间
  • 使用COM解决方案的秘密的存储位置可以被任何人看到和编辑
  • COM 解决方案中的隔离文件存储不适用于秘密信息

我意识到这些解决方案都不安全,但我正在寻找一种至少不会使其变得更加不安全的解决方案。