我有一个场景,必须为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();
}
基于此,管道的相对侧应该非常明显。
对于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);
}
}
}
}
还有一个COM组件从该存储位置读取并返回该密钥。
我基本上在寻找任何有关我为什么要使用这些技术之一或者考虑任何其他选项(RPC,邮箱等)的见解
我发现/考虑的一些事情
我意识到这些解决方案都不安全,但我正在寻找一种至少不会使其更加不安全的解决方案。