Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将SecureString从一个进程传递到另一个进程?_C#_.net_Ipc_Securestring - Fatal编程技术网

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

C# 如何将SecureString从一个进程传递到另一个进程?,c#,.net,ipc,securestring,C#,.net,Ipc,Securestring,我需要将SecureString从客户端进程传递到我的服务。两者都是使用.NET和C编写的。我使用命名管道在进程之间传递数据。我的问题是如何以字节数组的形式访问SecureString以将其传递给另一个进程?然后在接收过程中将其重新组装回SecureString?因为我们也遇到了同样的问题,而且我们无法访问加密的字节。我们所做的是,动态访问解密的字节,并使用我们自己的算法或加密技术对其进行加密。另一方面,对字节进行解密并逐字节分配给SecureString调用AppendChar函数。 用于访问

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

因为我们也遇到了同样的问题,而且我们无法访问加密的字节。我们所做的是,动态访问解密的字节,并使用我们自己的算法或加密技术对其进行加密。另一方面,对字节进行解密并逐字节分配给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吗?由于需要将字符串传递到字节数组进行序列化,无论如何,您将失去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] ));                       
 }