1

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

4

1 回答 1

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] ));                       
 }
于 2013-10-12T13:01:10.927 回答