C# 如何将SecureString从一个进程传递到另一个进程?
我需要将SecureString从客户端进程传递到我的服务。两者都是使用.NET和C编写的。我使用命名管道在进程之间传递数据。我的问题是如何以字节数组的形式访问SecureString以将其传递给另一个进程?然后在接收过程中将其重新组装回SecureString?因为我们也遇到了同样的问题,而且我们无法访问加密的字节。我们所做的是,动态访问解密的字节,并使用我们自己的算法或加密技术对其进行加密。另一方面,对字节进行解密并逐字节分配给SecureString调用AppendChar函数。 用于访问SecureString的字节数组的代码C# 如何将SecureString从一个进程传递到另一个进程?,c#,.net,ipc,securestring,C#,.net,Ipc,Securestring,我需要将SecureString从客户端进程传递到我的服务。两者都是使用.NET和C编写的。我使用命名管道在进程之间传递数据。我的问题是如何以字节数组的形式访问SecureString以将其传递给另一个进程?然后在接收过程中将其重新组装回SecureString?因为我们也遇到了同样的问题,而且我们无法访问加密的字节。我们所做的是,动态访问解密的字节,并使用我们自己的算法或加密技术对其进行加密。另一方面,对字节进行解密并逐字节分配给SecureString调用AppendChar函数。 用于访问
IntPtr passwordBytes = Marshal.SecureStringToCoTaskMemUnicode(password);
try
{
unsafe
{
byte* byteArrayStart = (byte*)passwordBytes.ToPointer();
int length = password.Length;
byte[] encrypted = new byte[length];
for (int i = 0; i < length; ++i)
{
encrypted[i] = EncryptByte(*(byteArrayStart + i));
}
}
}
finally
{
// This removed the decrypted data bytes from memory as soon as we finished encrypting bytes. Thus reducing the window that any one can access the secure password
Marshal.ZeroFreeGlobalAllocAnsi(passwordBytes);
}
现在,在另一个进程方面,我相信代码将很容易解密并分配给SecureString。请记住,在这里我们使用了AppendChar函数,这样所有解密的字节都不会立即显示或在内存中继续显示,从而减少了看到密码的机会。
例如
您真的需要使用SecureString吗?由于需要将字符串传递到字节数组进行序列化,无论如何,您将失去99%的保护。你能用一个字符串来代替吗?@ScottChamberlain:好吧,SecureString被表示为一个内存字节数组,对吗?我想传递字节数组,而不是将其解密为字符串。它存储为加密字节数组,但是您无法直接访问加密字节数组,访问字符串的唯一方法是将其解密到非托管内存。根据您使用的IPC的具体情况,您可能只需传递SecureStringToGlobalAllocUnicode返回的指针即可对其进行解密并返回指向其在内存中位置的指针。我不知道为什么我不能访问加密的内存阵列?因为它们不会在任何地方公开它,如果你能找到一种不用解密就可以访问它的方法,请随意发布它作为答案。嗯。什么是EncryptByte和DecryptByte?我想我可以使用AES:这些是您的自定义函数,您可以根据需要更改字节值,可能是AES,也可能只是加上减去一些可以在握手中交换的字节值
SecureString mypassword = new SecureString();
for (int i = 0; i < length; ++i) //length of bytes
{
mypassword.AppendChar ((char) DecryptByte(encryptedByteBuffer[i] ));
}