Есть ли способ аутентификации с помощью DirectoryServices для LDAP с использованием MD5?
Я использую VS 2012, C#.NET и создаю форму для аутентификации через LDAP.
У меня есть этот код, и он работает хорошо:
root = new DirectoryEntry(
"LDAP://192.168.116.20:389",
username,
password
);
И имя пользователя, и пароль имеют открытый текст.
Но я хочу создать "Запомнить пароль?" флажок, где я могу сохранить имя пользователя и пароль md5-хэшированные в файл.
Итак, как я могу аутентифицироваться с использованием хеша md5 с DirectoryEntry и LDAP?! Является ли это возможным?
3 ответа
Если вы решили зашифровать данные в файл, вы должны использовать класс System.Security.ProtectedData.
Зашифрованные данные могут быть привязаны к текущему пользователю или текущему компьютеру, на котором выполняется кодирование / декодирование.
Есть два простых метода, которые вы должны использовать:
- Защита - принимает массив байтов и шифрует данные.
- Снять защиту - принимает зашифрованные данные и возвращает байтовый массив.
Примеры:
private static void EncryptData(string data, Stream stream)
{
if (stream.CanWrite == false)
throw new IOException("Cannot write to stream.");
var bytes = Encoding.UTF8.GetBytes(data);
var encryptedBytes = ProtectedData.Protect(bytes, null, DataProtectionScope.CurrentUser);
stream.Write(encryptedBytes , 0, encryptedBytes .Length);
}
private static string DecryptData(Stream stream)
{
if (stream.CanRead == false)
throw new IOException("Cannot read fromstream.");
using (MemoryStream memoryStream = new MemoryStream())
{
stream.CopyTo(memoryStream);
var encryptedBytes = memoryStream.ToArray();
var decryptedBytes = ProtectedData.Unprotect(encryptedBytes, null, DataProtectionScope.CurrentUser)
return Encoding.UTF8.GetString(decryptedBytes);
}
}
Теперь, чтобы использовать их с FileStream просто:
public static void Encrypt(string password)
{
using (var fileStream = new FileStream(@"MyFile.dat", FileMode.Create))
{
EncryptData(password, fileStream);
fileStream.Close();
}
}
public static string Decrypt()
{
string password;
using (var fileStream = new FileStream(@"MyFile.dat", FileMode.Open))
{
password = DecryptData(fileStream);
fileStream.Close();
}
return password;
}
Кстати, если вы хотите увеличить сложность шифрования, вы можете передать энтропию методам защиты и снятия защиты. Для получения дополнительной информации см.: http://msdn.microsoft.com/en-us/library/system.security.cryptography.protecteddata.protect(v=vs.110).aspx
Я не верю, что LDAP - это протокол, и он работает против хэшей LM / NT, которые с уважением относятся к DES и MD4, но это более низкий уровень. Что вы, вероятно, хотите сделать, это зашифровать пароль, сохранить его, затем расшифровать и передать его в строку LDAP.
Я не верю, что LDAP - это протокол, и он работает против хэшей LM / NT, которые с уважением относятся к DES и MD4, но это более низкий уровень.
Хорошо, LDAP - это протокол, но LDAP НЕ использует хэши LM / NT.
Из LDAP хэш LM/NT/Kerboros и md5 может быть выполнен через SASL из LDAP, но только если клиент LDAP и сервер LDAP имеют эти возможности для использования SASL.
Краткий обзор (я думаю, что wk3-сервер) показывает, что ROOTDSE: supportSASLMechanisms: DIGEST-MD5 SupportedSASLMechanisms: ВНЕШНЯЯ ПОДДЕРЖКА
Это означает, что DIGEST-MD5 поддерживается в AD. Я не знаю, поддерживается ли это в API служб каталогов.