【问题标题】:Is there a way to authenticate with DirectoryServices to LDAP using MD5?有没有办法使用 MD5 通过 DirectoryServices 对 LDAP 进行身份验证?
【发布时间】:2013-02-18 18:42:31
【问题描述】:

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

我有这段代码,并且运行良好:

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

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

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

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

【问题讨论】:

    标签: c# ldap md5 directoryentry


    【解决方案1】:

    我不这么认为,LDAP 是一种协议,它适用于 LM / NT 哈希,分别是 DES 和 MD4,但这是较低级别的。您可能想要做的是加密密码,保存它,然后解密它并将其传递给 LDAP 字符串。

    【讨论】:

    • 猜这是唯一的方法。谢谢!
    【解决方案2】:

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

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

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

    • 保护 - 采用字节数组并加密数据。
    • 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;
    }
    

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

    【讨论】:

      【解决方案3】:

      我不这么认为,LDAP 是一种协议,它适用于 LM / NT 哈希,分别是 DES 和 MD4,但这是较低级别。

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

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

      快速查看(我认为是 wk3 服务器)显示了他的 ROOTDSE: 支持的SASL机制:DIGEST-MD5 支持的SASL机制:EXTERNAL 支持的SASL机制:GSS-SPNEGO 支持的SASL机制:GSSAPI

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-02-25
        • 2015-09-28
        • 2014-06-12
        • 2010-12-15
        • 2012-08-06
        • 1970-01-01
        • 1970-01-01
        • 2014-02-19
        相关资源
        最近更新 更多