在使用LDAP验证之前使用哈希密码

时间:2017-05-16 12:23:13

标签: c# ldap directoryentry

我有一个基于网络的工具。在登录表单上,密码将在发送之前进行哈希处理。 一切都很好,数据库只存储哈希密码。

现在,我们想要使用DirectoryEntry以上的LDAP进行登录。 但构造函数只接受普通密码。

我的问题:如何将散列密码传递给DirectoryEntry - 类?

目前的方法:

    public bool isAuthenticated(string domain, string username, string pwd)
    {
        string domainAndUsername = domain + @"\" + username;
        DirectoryEntry entry = new DirectoryEntry(_path, domainAndUsername, pwd);

        try
        {
            Object obj = entry.NativeObject;
            return true;
        }
        catch
        {
            return false;
        }
    }

1 个答案:

答案 0 :(得分:2)

我不知道C#,但就LDAP协议而言,无法使用已经散列的密码进行身份验证。

为什么在传输密码之前需要哈希密码?

如果要避免通过网络传输,最简单的解决方案是通过SSL连接到LDAP目录。

作为附注,IMO发送散列密码的安全性低于明确的密码:

  • 如果攻击者拦截了请求,他将能够使用他找到的数据进行身份验证
  • 如果攻击者成功转储数据库并检索哈希密码,如果他需要做的就是将其传输进行身份验证,则会将存储哈希密码的事实呈现为无用

编辑 :附加信息

我不知道你使用哪个LDAP目录,但是在OpenLDAP上,如果你不使用绑定操作,你可以实现这种机制(例如,你将无法使用密码策略覆盖)。

您可以将SASL Proxy Authorization实现为:

  • 使用技术帐户连接到目录
  • 搜索并检索尝试登录的条目用户
  • 测试自定义散列密码属性(如果提供的散列是存储的散列
  • 使用具有代理授权的另一个技术帐户重新绑定以充当此用户

它将使您仍然可以从用于执行用户操作的ACL机制和日志记录系统中受益

但是:这只能在OpenLDAP上使用(或者如果另一个LDAP实现提供相同的机制),并且它实际上不是关于LDAP协议的最先进的技术;)