C# 为什么SecureString解密在可执行文件之间给出不同的结果?

C# 为什么SecureString解密在可执行文件之间给出不同的结果?,c#,wcf,securestring,C#,Wcf,Securestring,在proxy.exe中,我用以下方式创建一个安全字符串: public SecureString GetSecureEncryptionKey() { string strPassword = "8charPwd"; SecureString secureStr = new SecureString(); if (strPassword.Length > 0) { foreach (var c

proxy.exe中,我用以下方式创建一个安全字符串:

public SecureString GetSecureEncryptionKey()
    {
        string strPassword = "8charPwd";
        SecureString secureStr = new SecureString();
        if (strPassword.Length > 0)
        {
            foreach (var c in strPassword.ToCharArray()) secureStr.AppendChar(c);
        }
        return secureStr;
    }
然后在main.exe中使用以下函数对其进行解密:

public string convertToUNSecureString(SecureString secstrPassword)
    {
        IntPtr unmanagedString = IntPtr.Zero;
        try
        {
            unmanagedString = Marshal.SecureStringToGlobalAllocUnicode(secstrPassword);
            return Marshal.PtrToStringUni(unmanagedString);
        }
        finally
        {
            Marshal.ZeroFreeGlobalAllocUnicode(unmanagedString);
        }
    }

问题是返回的字符串是空的,除非我在main.exe中加密初始字符串,否则返回的解密字符串实际上是“8charPwd”。为什么会这样?SecureString加密是否绑定到可执行文件?

SecureString的目的是使字符串在应用程序内存中保持安全(使字符串在RAM中保持安全) SecureString对象不是可序列化的。 不能在应用程序之间传输实例

SecureString使用带有标志“0”(只有相同的进程才能解密内容)的RtlEncryptMemory(WINAPI)对字符串进行加密

如果您不想(在任何时候)公开RAM中的密码,可以创建一个简单的模糊(或加密)逻辑,然后传输内容

编辑:

我发现了两个可能对你有帮助的老问题:


SecureString的目的是确保应用程序内存中的字符串安全(确保RAM中的字符串安全) SecureString对象不是可序列化的。 不能在应用程序之间传输实例

SecureString使用带有标志“0”(只有相同的进程才能解密内容)的RtlEncryptMemory(WINAPI)对字符串进行加密

如果您不想(在任何时候)公开RAM中的密码,可以创建一个简单的模糊(或加密)逻辑,然后传输内容

编辑:

我发现了两个可能对你有帮助的老问题:



我想指出的一点是,通过硬编码
string strPassword=“8charPwd”,您正在使安全字符串完全无用。这就像锁上门,然后把钥匙挂在门旁边。谢谢你指出这一点,但指出这一点是没有用的,因为包含实际字符串的应用程序是服务器端/反编译安全的,它的运行时间不到一秒钟,足以将安全字符串发送到主应用程序。我的问题是secureString没有得到应有的解密。secureString的一般用途是在内存中加密存储密码。因此,如果进行内存转储,则更难找到密码的位置。SecureString将数据存储在一个进程的地址空间中。所以我很好奇你是如何在进程之间传递SecureString的?哇,你真的让人们不想帮助你。放下这些不好的东西,也许人们会更愿意花自己的时间来帮助你。我只是不喜欢有人基于错误的前提自动地认为我是个白痴。我问了一个问题,我希望得到中肯的答案,而不是与提出的问题无关的附带建议。我想指出的一点是,通过硬编码
string strPassword=“8charPwd”,您正在使安全字符串完全无用。这就像锁上门,然后把钥匙挂在门旁边。谢谢你指出这一点,但指出这一点是没有用的,因为包含实际字符串的应用程序是服务器端/反编译安全的,它的运行时间不到一秒钟,足以将安全字符串发送到主应用程序。我的问题是secureString没有得到应有的解密。secureString的一般用途是在内存中加密存储密码。因此,如果进行内存转储,则更难找到密码的位置。SecureString将数据存储在一个进程的地址空间中。所以我很好奇你是如何在进程之间传递SecureString的?哇,你真的让人们不想帮助你。放下这些不好的东西,也许人们会更愿意花自己的时间来帮助你。我只是不喜欢有人基于错误的前提自动地认为我是个白痴。我问了一个问题,我希望得到中肯的答案,而不是与提出的问题无关的附带建议。好吧,我想这回答了我的问题。SecureString只能由创建它的同一进程解密。问题是,即使我传递一个加密字符串(由我自己加密),当我解密它时,它仍然会存储在内存中,即使我只是直接将其作为参数传递,而不将其保存到任何变量。@IneedHelp这不是最简单的方法,但这是我想到的解决问题的第一种方法(因为我做了一些类似的测试)您可以创建一个,然后服务器将每个字符插入SecureStringInstance。我现在面临的问题是,我无法在需要字符串的上下文中实际使用SecureString…您能给我一个这个问题的示例吗?我基本上是尝试以安全的方式使用字符串,我想我可以暂时转换一秒ureString是解密操作中需要密钥传递的实际字符串,但显然解密的字符串总是显示在内存中..好的,我想这回答了我的问题。SecureString只能通过创建它的同一进程解密。问题是,即使我传递加密字符串(由我自己加密),当我解密它时,它仍然会存储在内存中,即使我只是直接将其作为参数传递,而不将其保存到任何变量。@IneedHelp这不是最简单的方法,但这是我想到的解决问题的第一种方法(因为我给出了类似于test的东西)您可以创建一个,然后服务器将每个字符插入SecureStringInstance。我现在面临的问题是,我无法在需要字符串的上下文中实际使用SecureString…您能给我一个这个问题的示例吗?我基本上是尝试以安全的方式使用字符串,我想我可以暂时转换一秒ureString转换为解密操作中需要