基于Python ldap3实现LDAP存储密码与输入值的精准比对
Python实现LDAP加盐密码(SSHA)精准比对函数
要精准比对LDAP条目中的加盐密码(比如SSHA格式),不用bind操作的话,得手动解析密码结构并重新计算哈希比对。以你给出的{SSHA}F5GwOd39wiK+jEKD6UwCs+9XvzvdRYlX为例,对应密码testpassword,具体实现步骤如下:
核心原理
SSHA格式的密码由{SSHA}前缀 + Base64编码串组成,解码Base64后:
- 前20字节:原始密码加盐后的SHA-1哈希值
- 剩余部分:随机盐值
比对时,只需用用户输入的密码加上提取出的盐值,重新计算SHA-1哈希,再和LDAP存储的哈希值对比即可。
实现代码
import hashlib import base64 def verify_ssha_password(stored_password: str, input_password: str) -> bool: # 校验密码格式是否为SSHA if not stored_password.startswith("{SSHA}"): return False # 剥离前缀,提取Base64编码部分 b64_encoded = stored_password[6:] try: # 解码Base64数据 decoded_data = base64.b64decode(b64_encoded) except: return False # 拆分哈希值和盐(SHA-1哈希固定20字节) stored_hash = decoded_data[:20] salt = decoded_data[20:] # 计算输入密码加盐后的SHA-1哈希 hasher = hashlib.sha1() hasher.update(input_password.encode("utf-8")) hasher.update(salt) computed_hash = hasher.digest() # 比对哈希值是否一致 return computed_hash == stored_hash # 测试示例 if __name__ == "__main__": ldap_stored_pwd = "{SSHA}F5GwOd39wiK+jEKD6UwCs+9XvzvdRYlX" user_input_pwd = "testpassword" print(verify_ssha_password(ldap_stored_pwd, user_input_pwd)) # 输出True
扩展说明
如果你的LDAP还用到其他加盐哈希算法(比如SSHA256),只需调整对应的哈希算法和哈希长度:
- SSHA256:哈希算法用
hashlib.sha256(),哈希长度取32字节 - SSHA512:哈希算法用
hashlib.sha512(),哈希长度取64字节
在LDAP Account Manager中集成时,只需从目标条目里获取到你要比对的那一个密码值,传入这个函数就能得到精准的比对结果,不用绑定整个账号验证。
内容的提问来源于stack exchange,提问作者Luxman
相关产品推荐
相关产品推荐

