2015-12-10 9 views
1

Я пробовал шифрование паролей с использованием UTF8 Algorithm и SHA256, но было рекомендовано не использовать их. Вместо этого мне предложили использовать DPAPI. Я просмотрел несколько примеров кода из Google, которые не были ясны. Можете ли вы мне помочь с алгоритмом DPAPI.Шифрование паролей DPAPI в C# и сохранение в базе данных. Затем Дешифрование с помощью ключа

ответ

0

В соответствии с MSDN DPAPI использует «пользовательские или машинные учетные данные для шифрования или дешифрования данных». Я думаю, что он использует алгоритм DES или AES.

Но для пароля вы всегда должны использовать односторонние хеш-функции (MD5, SHA1 ...) с солью перед сохранением в DB. Даже если хакер может получить доступ к вашему серверу, он никогда не сможет расшифровать пароль пользователей.

Итак, просто придерживайтесь своего решения SHA256. Не забудьте добавить соль до того, как она будет содержать ее.

+0

Вы не хотите использовать MD5 или SHA-1, потому что они слишком быстры и могут быть грубо вынуждены с легкостью на современном оборудовании. Вам нужно что-то вроде bcrypt или другой функции жесткого пароля. Кроме того, вопрос не означает, что пользователь имеет контроль над проверкой пароля, просто потому, что он хочет сохранить пароль. – Dan

4

Вы можете получить доступ к DPAPI, используя класс ProtectedData. Существует два режима шифрования:

  • CurrentUser: Защищенные данные связаны с текущим пользователем. Только потоки, запущенные под текущим контекстом пользователя, могут снимать защиту с данных.
  • LocalMachine: защищенные данные связаны с контекстом машины. Любой процесс, выполняющийся на компьютере, может снять защиту. Это значение перечисления обычно используется в приложениях, специфичных для сервера, которые выполняются на сервере, где недоверенным пользователям не разрешен доступ.

Encode строку и возвращает строку Base64, что вы можете сохранить в базе данных:

public static string Protect(string stringToEncrypt, string optionalEntropy, DataProtectionScope scope) 
{ 
    return Convert.ToBase64String(
     ProtectedData.Protect(
      Encoding.UTF8.GetBytes(stringToEncrypt) 
      , optionalEntropy != null ? Encoding.UTF8.GetBytes(optionalEntropy) : null 
      , scope)); 
} 

Decode строковым Base64 (который ранее был сохранен в базе данных):

public static string Unprotect(string encryptedString, string optionalEntropy, DataProtectionScope scope) 
    { 
     return Encoding.UTF8.GetString(
      ProtectedData.Unprotect(
       Convert.FromBase64String(encryptedString) 
       , optionalEntropy != null ? Encoding.UTF8.GetBytes(optionalEntropy) : null 
       , scope)); 
    } 

Необходимо помнить, что шифрование действительно только для машины (и пользователя, если вы выбираете режим шифрования CurrentUser), поэтому шифрование/дешифрование необходимо выполнять на одном сервере.

Если вы планируете использовать DPAPI в условиях баланса нагрузки see this article.

Дайте мне знать, если вам нужна дополнительная информация.