2015-02-14 5 views
1

В proxy.exe я создаю защищенную строку следующим образом:Почему шифрование SecureString дает разные результаты между исполняемыми файлами?

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 связано с исполняемым файлом?

+0

Одна вещь, которую я хотел бы отметить, что вас» re делает безопасную строку совершенно бесполезной благодаря жесткому кодированию 'string strPassword =" 8charPwd ";'. Это как запирать дверь в ваш дом и подвешивать ключи рядом с ней. –

+1

Спасибо, что указали это, но бесполезно указывать на это, потому что приложение, содержащее фактическую строку, защищено на стороне сервера/декомпилировано, и оно предназначено для работы менее секунды, чтобы отправить защищенную строку в основное приложение , Моя проблема в том, что secureString не расшифровывается, как следует. – IneedHelp

+2

Общее назначение SecureString - хранить пароли * в памяти * зашифрованы. Поэтому, если вы делаете дамп памяти, сложнее узнать, где находится пароль. SecureString хранит данные в адресном пространстве одного процесса. Поэтому мне интересно, как вы передаете SecureString между процессами? –

ответ

6

Цель SecureString - сохранить безопасность строк в памяти приложения (сохранить строку в оперативной памяти) Объект SecureString не может быть сериализуемым. Вы не можете передавать экземпляр между приложениями.

SecureString шифрует строку с помощью RtlEncryptMemory (WINAPI) с флагом: «0» (только тот же процесс может расшифровать содержимое). RtlEncryptMemory API

Если вы не хотите выставлять пароль (в любое время) в ОЗУ, вы можете создать простую логику обфускации (или шифрования), а затем передать содержимое.

Edit:

Я нашел 2 старые вопросы, которые могут быть полезны для вас:

When would I need a SecureString in .NET?

Wcf-Authentication and Logging

+0

Итак, я думаю, это отвечает на мой вопрос. SecureString может быть расшифрован только тем же процессом, который его создал. Проблема в том, что даже если я передаю зашифрованную строку (зашифрованную мной), когда я ее расшифровываю, она по-прежнему хранится в памяти, даже если я просто передаю ее непосредственно в качестве параметра, не сохраняя ее для любой переменной. – IneedHelp

+0

@IneedHelp Это не самый простой способ, но это первый способ, которым я решил решить проблему (потому что я дал что-то похожее на тест), вы можете создать машину [Enigma] (http://en.wikipedia.org/wiki/Enigma_machine), а затем сервер вставляет каждый символ в экземпляр SecureString –

+0

, с которым я столкнулся сейчас, заключается в том, что я не могу использовать SecureString в контексте, где требуется строка ... – IneedHelp

Смежные вопросы