Я пробовал шифрование паролей с использованием UTF8 Algorithm и SHA256, но было рекомендовано не использовать их. Вместо этого мне предложили использовать DPAPI. Я просмотрел несколько примеров кода из Google, которые не были ясны. Можете ли вы мне помочь с алгоритмом DPAPI.Шифрование паролей DPAPI в C# и сохранение в базе данных. Затем Дешифрование с помощью ключа
ответ
В соответствии с MSDN DPAPI использует «пользовательские или машинные учетные данные для шифрования или дешифрования данных». Я думаю, что он использует алгоритм DES или AES.
Но для пароля вы всегда должны использовать односторонние хеш-функции (MD5, SHA1 ...) с солью перед сохранением в DB. Даже если хакер может получить доступ к вашему серверу, он никогда не сможет расшифровать пароль пользователей.
Итак, просто придерживайтесь своего решения SHA256. Не забудьте добавить соль до того, как она будет содержать ее.
Вы можете получить доступ к 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.
Дайте мне знать, если вам нужна дополнительная информация.
Вы не хотите использовать MD5 или SHA-1, потому что они слишком быстры и могут быть грубо вынуждены с легкостью на современном оборудовании. Вам нужно что-то вроде bcrypt или другой функции жесткого пароля. Кроме того, вопрос не означает, что пользователь имеет контроль над проверкой пароля, просто потому, что он хочет сохранить пароль. – Dan