如何将安全字符串从一个进程传递到另一个进程

本文关键字:进程 一个 另一个 安全 字符串 | 更新日期: 2023-09-27 18:34:56

我需要将SecureString从客户端进程传递到我的服务。两者都是使用 .NET 和 C# 编写的。我正在使用命名管道在进程之间传递数据。我的问题是如何访问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 mypassword = new SecureString();
 for (int i = 0; i < length; ++i) //length of bytes
 {
    mypassword.AppendChar ((char) DecryptByte(encryptedByteBuffer[i] ));                       
 }