C# 有没有一种方法可以使用MD5通过DirectoryServices对LDAP进行身份验证?

C# 有没有一种方法可以使用MD5通过DirectoryServices对LDAP进行身份验证?,c#,ldap,md5,directoryentry,C#,Ldap,Md5,Directoryentry,我正在使用VS 2012、C.NET并创建一个表单来通过LDAP进行身份验证 我有这个代码,它运行良好: root = new DirectoryEntry( "LDAP://192.168.116.20:389", username, password ); 用户名和密码都是纯文本 但是我想创建一个记住密码?复选框,我可以将用户名和密码md5散列保存在文件中 那么,如何使用

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

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

root = new DirectoryEntry(
                "LDAP://192.168.116.20:389",
                username,
                password
            );
用户名和密码都是纯文本

但是我想创建一个记住密码?复选框,我可以将用户名和密码md5散列保存在文件中


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

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

我不这么认为,LDAP是一种协议,它可以对抗LM/NT哈希,它们分别是DES和MD4,但级别较低。您可能需要对密码进行加密、保存、解密并将其传递给LDAP字符串


我不这么认为,LDAP是一种协议,它可以对抗LM/NT 散列,它们分别是DES和MD4,但这是较低的级别

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

从LDAP可以通过从LDAP执行LM/NT/Kerboros和md5哈希,但前提是LDAP客户端和LDAP服务器具有利用SASL的能力

我认为wk3服务器在ROOTDSE中显示: 支持的SASLME机制:摘要-MD5 支持的SASLME机制:外部 支持的SASLME机制:GSS-SPNEGO 支持的SASLME机制:GSSAPI

这意味着DIGEST-MD5在AD中受支持。我不知道目录服务API是否支持这一点


我不这么认为,LDAP是一种协议,它可以对抗LM/NT 散列,它们分别是DES和MD4,但这是较低的级别

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

从LDAP可以通过从LDAP执行LM/NT/Kerboros和md5哈希,但前提是LDAP客户端和LDAP服务器具有利用SASL的能力

我认为wk3服务器在ROOTDSE中显示: 支持的SASLME机制:摘要-MD5 支持的SASLME机制:外部 支持的SASLME机制:GSS-SPNEGO 支持的SASLME机制:GSSAPI


这意味着DIGEST-MD5在AD中受支持。我不知道目录服务API是否支持这一点。

如果选择将数据加密到文件,则应使用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);
    }
}
现在,为了在文件流中使用它们,只需:

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方法。
有关详细信息,请参阅:

如果选择将数据加密到文件,则应使用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);
    }
}
现在,为了在文件流中使用它们,只需:

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方法。
有关更多信息,请参阅:

我想这是唯一的方法。非常感谢。我想这是唯一的办法。非常感谢。