如何将 SecureString 从一个进程传递到另一个进程?
Posted
技术标签:
【中文标题】如何将 SecureString 从一个进程传递到另一个进程?【英文标题】:How to pass SecureString from one process to another? 【发布时间】:2013-10-12 03:35:56 【问题描述】:我需要将SecureString
从我的客户端进程传递给我的服务。两者都是使用 .NET 和 C# 编写的。我正在使用命名管道在进程之间传递数据。我的问题是如何以字节数组的形式访问SecureString
以将其传递给另一个进程?然后在接收过程中重新组装回SecureString
?
【问题讨论】:
您真的需要使用 SecureString 吗?通过需要将字符串传递给字节数组进行序列化,无论如何您都将失去 99% 的保护。 可以你只使用String
吗?
@ScottChamberlain:嗯,SecureString 表示为内存字节数组,对吧?我想传递那个字节数组而不是把它解密成一个字符串。
它被存储为一个加密的字节数组,但是你不能直接访问加密的字节数组,他们访问字符串的唯一方法是将它解密到非托管内存。根据您使用的 IPC 的具体情况,您可以只传递 SecureStringToGlobalAllocUnicode
返回的指针
SecureStringToGlobalAllocUnicode
解密它并返回一个指向它在内存中的位置的指针。我不知道为什么我无法访问加密的内存阵列?
因为他们不会在任何地方公开它,如果您可以找到一种无需解密的方式访问它,请随时将其作为答案发布。
【参考方案1】:
由于我们也遇到了同样的问题,并且由于我们无法访问加密的字节,所以我们可以即时访问解密的字节并使用我们自己的算法或加密技术对其进行加密。而另一端则解密字节并逐字节分配给 SecureString 调用 AppendChar 函数。 访问 SecureString 字节数组的代码
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 mypassword = new SecureString();
for (int i = 0; i < length; ++i) //length of bytes
mypassword.AppendChar ((char) DecryptByte(encryptedByteBuffer[i] ));
【讨论】:
嗯。EncryptByte
和 DecryptByte
是什么?我想我可以使用 AES:***.com/questions/202011/…
这些是您的自定义函数,您可以根据需要更改字节值,可能是 AES 或只是加减一些可以在握手中交换的字节值以上是关于如何将 SecureString 从一个进程传递到另一个进程?的主要内容,如果未能解决你的问题,请参考以下文章