1

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 暗号化は実行可能ファイルにバインドされていますか?

4

1 に答える 1

6

SecureString の目的は、アプリケーション メモリ内で文字列を安全に保つことです (文字列を RAM に安全に保持します)。 SecureString オブジェクトはシリアライズ可能ではありません。アプリケーション間でインスタンスを転送することはできません。

SecureString は、RtlEncryptMemory (WINAPI) をフラグ "0" で使用して文字列を暗号化します (同じプロセスのみがコンテンツを復号化できます)。RtlEncryptMemory API

パスワードを (いつでも) RAM に公開したくない場合は、単純な難読化 (または暗号化) ロジックを作成してから、コンテンツを転送できます。

編集:

参考になるかもしれない 2 つの古い質問を見つけました。

.NET で SecureString が必要になるのはいつですか?

Wcf-認証とロギング

于 2015-02-14T15:09:15.800 に答える