【问题标题】:Correct encoding for unicodePwd in Active DirectoryActive Directory 中 unicodePwd 的正确编码
【发布时间】:2015-06-02 02:57:33
【问题描述】:
简而言之,Active Directory 中 unicodePwd 属性的正确字符编码是什么? UCS-2? UTF-16?是否有任何理由选择 UTF-16 而不是 UCS-2?
现在,解释一下:
我在使用 PHP 的 ldap_mod_replace() 设置 Active Directory 中的 unicodePwd 属性时遇到问题,直到我(在某种程度上)找到了正确的格式,即用双引号括起来并以 UCS-2/UTF-16 Little Endian 编码(如果将其放入 LDIF 文件中,也可以进行 base64 编码)。
虽然解决了根本问题,但我无法理解我一直看到互联网上提到的两种编码都是正确的事实。
我在这里很迂腐,但有人能指出正确的字符编码吗?
【问题讨论】:
标签:
encoding
active-directory
【解决方案1】:
正确的字符编码是 UTF-16LE。此外,密码必须用双引号引起来。我不确定在哪里提到了 UCS-2 编码,个人从未见过。
示例
用户密码:test
引用密码:“test”
UTF-16LE 表示:
0x22 "
0x00
0x74 t
0x00
0x65 e
0x00
0x73 s
0x00
0x74 t
0x00
0x22 "
0x00
更多详情请访问MSDN。
【解决方案2】:
tl;dr 使用 UTF-16LE 而不是 UCS-2LE
回答我自己的问题:我所要做的就是尝试在 UTF-16 中设置一个包含 4 个字节字符的密码,以查看在尝试登录时是否可以正确识别和接受此类字符。
为了做到这一点,我在普通密码中间放了一个(对我而言)相当陌生的日文字符,尝试设置密码并查看反应。
事实证明,它确实接受了带有笨拙密码的 ldap_mod_replace() 调用。不仅如此,当我尝试使用刚刚设置的密码登录时,它也接受了,中间是日文字符。
总之,(如果我没记错的话)这表明 Active Directory 的 unicodePwd 属性不仅接受 UTF-16 字符,否则 UCS-2 中不存在,它的行为也应如此当密码包含长度为 4 个字节的字符时。