在使用 LDAP 验证之前散列密码
Hash password before validate with LDAP
我有一个基于网络的工具。在登录表单上,密码将在发送前进行哈希处理。
没问题,数据库只存储散列密码。
现在,我们需要通过 DirectoryEntry
使用 LDAP 登录。
但是构造函数只接受纯密码。
我的问题:如何将散列密码传递给 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上,如果你不使用bind操作,你可以实现这种机制(例如,你将无法使用密码策略叠加)。
您可以实施 SASL Proxy Authorization 到 :
- 使用技术帐户连接到目录
- 搜索并检索尝试登录的入口用户
- 如果提供的散列是存储的散列,则测试自定义散列密码属性
- 与另一个具有代理授权的技术帐户重新绑定以充当此用户
它将允许您仍然受益于 ACL 机制和用户执行操作的日志系统
但是:这将仅在 OpenLDAP 上可用(或者如果另一个 LDAP 实现提供相同的机制)并且它并不是关于 LDAP 协议的最先进的技术;)
我有一个基于网络的工具。在登录表单上,密码将在发送前进行哈希处理。 没问题,数据库只存储散列密码。
现在,我们需要通过 DirectoryEntry
使用 LDAP 登录。
但是构造函数只接受纯密码。
我的问题:如何将散列密码传递给 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上,如果你不使用bind操作,你可以实现这种机制(例如,你将无法使用密码策略叠加)。
您可以实施 SASL Proxy Authorization 到 :
- 使用技术帐户连接到目录
- 搜索并检索尝试登录的入口用户
- 如果提供的散列是存储的散列,则测试自定义散列密码属性
- 与另一个具有代理授权的技术帐户重新绑定以充当此用户
它将允许您仍然受益于 ACL 机制和用户执行操作的日志系统
但是:这将仅在 OpenLDAP 上可用(或者如果另一个 LDAP 实现提供相同的机制)并且它并不是关于 LDAP 协议的最先进的技术;)