如何将SecureString从一个进程传递到另一个进程?

时间:2013-10-12 03:35:56

标签: c# .net ipc securestring

我需要将SecureString从我的客户端进程传递给我的服务。两者都是使用.NET和C#编写的。我正在使用命名管道在进程之间传递数据。我的问题是如何访问SecureString字节数组以将其传递给另一个进程?然后在接收过程中将其重新组合回SecureString

1 个答案:

答案 0 :(得分:0)

由于我们也遇到了同样的问题,并且因为我们无法访问加密字节,所以我们在飞行中访问解密的字节并使用我们自己的算法或加密技术对它们进行加密。另一方面解密字节并逐字节地分配给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] ));                       
 }