首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何将SecureString转换为System.String?

如何将SecureString转换为System.String?
EN

Stack Overflow用户
提问于 2009-05-04 11:36:25
回答 13查看 138.9K关注 0票数 175

除了之外,所有关于通过创建一个System.String来解除你的SecureString安全的保留意见,该怎么做呢?

如何将普通System.Security.SecureString转换为System.String?

我相信你们中许多熟悉SecureString的人都会回应说,永远不应该将SecureString转换为普通的.NET字符串,因为它会移除所有的安全保护。我认识。但是现在,我的程序使用普通字符串做所有的事情,我正在尝试增强它的安全性,尽管我将使用一个返回SecureString的API,但我并不打算用它来提高安全性。

我知道Marshal.SecureStringToBSTR,但我不知道如何利用它来创建一个System.String。

对于那些想知道我为什么要这样做的人来说,我从一个用户那里获取了一个密码,并将其作为html表单提交,以便将该用户登录到一个网站。所以..。这实际上必须使用托管的、未加密的缓冲区来完成。如果我甚至可以访问非托管的、未加密的缓冲区,我想我可以在网络流上进行逐字节流写入,并希望这样可以确保整个过程中密码的安全。我希望至少对其中一种情况有一个答案。

EN

回答 13

Stack Overflow用户

回答已采纳

发布于 2009-05-04 11:21:15

使用System.Runtime.InteropServices.Marshal类:

代码语言:javascript
复制
String SecureStringToString(SecureString value) {
  IntPtr valuePtr = IntPtr.Zero;
  try {
    valuePtr = Marshal.SecureStringToGlobalAllocUnicode(value);
    return Marshal.PtrToStringUni(valuePtr);
  } finally {
    Marshal.ZeroFreeGlobalAllocUnicode(valuePtr);
  }
}

如果要避免创建托管字符串对象,可以使用Marshal.ReadInt16(IntPtr, Int32)访问原始数据

代码语言:javascript
复制
void HandleSecureString(SecureString value) {
  IntPtr valuePtr = IntPtr.Zero;
  try {
    valuePtr = Marshal.SecureStringToGlobalAllocUnicode(value);
    for (int i=0; i < value.Length; i++) {
      short unicodeChar = Marshal.ReadInt16(valuePtr, i*2);
      // handle unicodeChar
    }
  } finally {
    Marshal.ZeroFreeGlobalAllocUnicode(valuePtr);
  }
}
票数 211
EN

Stack Overflow用户

发布于 2014-09-10 02:53:16

显然,您知道这与SecureString的全部目的背道而驰,但我还是要重申这一点。

如果你想要一行程序,试试这个:(仅限.NET 4和更高版本)

代码语言:javascript
复制
string password = new System.Net.NetworkCredential(string.Empty, securePassword).Password;

其中securePassword是一个SecureString。

票数 134
EN

Stack Overflow用户

发布于 2009-05-04 03:38:34

见鬼。在发布了这篇文章之后,我在this article中找到了答案。但是,如果有人知道如何访问此方法公开的非托管、未加密的IntPtr缓冲区,请一次访问一个字节,这样我就不必在其中创建托管字符串对象来保持高安全性,请添加答案。:)

代码语言:javascript
复制
static String SecureStringToString(SecureString value)
{
    IntPtr bstr = Marshal.SecureStringToBSTR(value);

    try
    {
        return Marshal.PtrToStringBSTR(bstr);
    }
    finally
    {
        Marshal.FreeBSTR(bstr);
    }
}
票数 52
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/818704

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档