Есть ли способ аутентификации с помощью 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 служб каталогов.

Другие вопросы по тегам