1

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

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

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

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

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

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

4

3 回答 3

2

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

于 2013-02-18T19:12:51.693 回答
1

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

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

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

快速查看(我认为 wk3 服务器)显示了 ROOTDSE:supportedSASLMechanisms:DIGEST-MD5 supportedSASLMechanisms:EXTERNAL supportedSASLMechanisms:GSS-SPNEGO supportedSASLMechanisms:GSSAPI

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

于 2013-02-19T11:39:21.390 回答
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;
}

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

于 2014-02-20T09:14:35.450 回答