通过网络将C#SecureString发送到字节 - 我应该担心编码吗?

时间:2015-05-13 13:16:48

标签: c# wcf encoding

我试图实现以下目标:

为了确保客户端计算机尽可能地保存敏感数据(在SecureString中):

  • 将一个字节数组固定到存放敏感字符串(SecureString)的BSTR的内存
  • 使用WCF逐字节传输敏感数据(每次发送清除每个字节)
  • 收到所有内容后,服务器需要解码字节,然后再回到字符串

我非常关注编码 - 我知道C#将字符串数据保存为UTF-16,但在执行以下操作时可能无法解释它吗?:< / p>

  • 客户端计算机转换为BSTR - &gt;到字节 - &gt;通过电线发送(WCF)
  • 服务器获取BSTR数组,并将其转换回字符串

我应该担心编码吗? 谢谢!

===编辑 - 可能的解决方案===

在咨询EBrown后,他发现microsoft使用以下BOM: https://msdn.microsoft.com/en-us/library/windows/desktop/dd374101%28v=vs.85%29.aspx

转换为BSTR字节,我使用以下方法(内部有点改变): https://stackoverflow.com/a/25190648/1845545

并且,因为C#使用UTF-16编码,我将使用以下命令将其转换回来:Encoding.Unicode.GetString(bt);

1 个答案:

答案 0 :(得分:2)

SecureString已经提供了防止核心转储或交换文件泄漏的保护,甚至可以防止读取进程内存:

  

SecureString对象的值可能使用底层操作系统提供的保护机制,例如加密

报价&#39;操作系统机制&#39;是CryptProtectMemory

  

CryptProtectMemory函数对内存进行加密,以防止其他人查看您进程中的敏感信息。例如,使用CryptProtectMemory函数加密包含密码的内存。加密密码可防止其他人在将进程分页到交换文件时查看密码。

通过尝试该计划,您支持所有您实现的只是SecureString提供的安全性的严重弱化。在WCF传输过程中,您在进程内存中显示密码,您将通过不必要地使用网络暴露您的密码(HTTPS不会防止像Lenovo SuperFish MITM这样的东西,还有更多)。