C# 使用LDAP验证前哈希密码

C# 使用LDAP验证前哈希密码,c#,ldap,directoryentry,C#,Ldap,Directoryentry,我有一个基于网络的工具。在登录表单上,密码将在发送前进行哈希运算。 好吧,数据库只存储散列密码 现在,我们需要通过LDAP登录DirectoryEntry。 但是构造函数只接受普通密码 我的问题:如何将哈希密码传递给DirectoryEntry-class 现行方法: public bool isAuthenticated(string domain, string username, string pwd) { string domainAndUsername

我有一个基于网络的工具。在登录表单上,密码将在发送前进行哈希运算。 好吧,数据库只存储散列密码

现在,我们需要通过LDAP登录
DirectoryEntry
。 但是构造函数只接受普通密码

我的问题:如何将哈希密码传递给
DirectoryEntry
-class

现行方法:

    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;
        }
    }
我不知道C#,但就LDAP协议而言,无法使用已经散列的密码进行身份验证

为什么在传输密码之前需要对密码进行哈希运算

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

作为旁注,IMO,传输散列密码的安全性不如清晰密码:

  • 如果攻击者截获该请求,他将能够通过任何一种方式找到的数据进行身份验证
  • 如果攻击者成功转储数据库并检索散列密码,如果他所需要做的只是传输该密码以进行身份验证,则存储散列密码的事实将变得无用

编辑:附加信息

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

您可以实现以下功能:

  • 使用技术帐户连接到目录
  • 搜索并检索尝试登录的条目用户
  • 如果提供的哈希密码是存储的密码,则测试自定义哈希密码属性
  • 使用另一个具有代理权限的技术帐户重新绑定以充当此用户
它将允许您仍然受益于ACL机制和用户操作日志记录系统


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

程序员能够存储所有传入用户(以及他们的普通通行证)。整个公司必须相信程序员(我),我不会那样做。在LDAP之前,我在传输之前哈希pass,然后再次哈希(salted)服务器端。我无法获得用户通行证,数据库已保存。@user6537157好的,我能理解这个想法。但LDAP协议不允许绑定操作的情况仍然适用;)至少在不创建某种特定代码以允许后端的功能性(例如OpenLDAP覆盖)的情况下@user6537157我添加了一些关于您可以实现的解决方案的信息