有没有办法使用MD5对DirectoryServices进行LDAP身份验证?

时间:2013-02-18 18:42:31

标签: c# ldap md5 directoryentry

我正在使用VS 2012,C#.NET并创建一个表单以通过LDAP进行身份验证。

我有这个代码,而且运行良好:

root = new DirectoryEntry(
                "LDAP://192.168.116.20:389",
                username,
                password
            );

用户名和密码都是纯文本。

但我想创建一个“记住密码?”复选框,我可以在文件中保存用户名和密码md5-hashed。

那么,如何使用DirectoryEntry和LDAP使用md5-hash进行身份验证?!有可能吗?

3 个答案:

答案 0 :(得分:2)

我不相信,LDAP是一种协议,它可以对抗LM / NT哈希,它们是DES& MD4尊敬,但那是较低的水平。您可能想要做的是加密密码,保存密码,然后解密并将密码传递给LDAP字符串。

答案 1 :(得分:1)

  

我不相信,LDAP是一种协议,它适用于LM / NT   哈希,是DES& MD4尊重,但那是较低的水平。

LDAP是一种协议,但LDAP不使用LM / NT哈希值。

从LDAP可以通过SASL从LDAP完成LM / NT / Kerboros和md5-hash,但前提是LDAP客户端和LDAP服务器具有使用SASL的功能。

一个quik看一下(我认为wk3服务器)在ROOTDSE中显示: supportedSASLMechanisms:DIGEST-MD5 supportedSASLMechanisms:EXTERNAL supportedSASLMechanisms:GSS-SPNEGO supportedSASLMechanisms:GSSAPI

这意味着AD支持DIGEST-MD5。我不知道目录服务API是否支持此功能。

答案 2 :(得分:1)

如果您选择将数据加密为文件,则应使用 System.Security.ProtectedData 类。

您加密的数据可以绑定到当前用户或正在进行编码/解码的当前计算机。

您应该使用两种简单的方法:

  • Protect - 采用字节数组并加密数据。
  • Unprotect - 获取加密数据并返回字节数组。

示例:

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;
}

顺便说一句,如果您想增加加密的复杂性,可以将Entropy传递给Protect和Unprotect方法。 有关详细信息,请参阅:http://msdn.microsoft.com/en-us/library/system.security.cryptography.protecteddata.protect(v=vs.110).aspx