在Active Directory中更正unicodePwd的编码

时间:2015-06-02 02:57:34

标签: encoding active-directory

简而言之,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编码)。

虽然潜在的问题已经解决,但我无法理解这一事实,我一直认为这两种编码在互联网上都是正确的。

我在这里非常迂腐,但有人能指出正确的字符编码吗?

2 个答案:

答案 0 :(得分:1)

tl; dr 使用UTF-16LE代替UCS-2LE

回答我自己的问题:我所要做的就是尝试设置一个包含4个字节字符的UTF-16密码,用于查看在尝试登录时是否能正确识别并接受密码。< / p>

为了做到这一点,我在一个普通密码的中间放了一个相当奇怪的(对我来说)日文字符,试图设置密码并查看反应。

事实证明,它确实接受了使用尴尬密码的 ldap_mod_replace()调用。不仅如此,当我尝试使用我刚刚在中间设置日语字符的密码登录时,它就被接受了。

总之,(如果我没有记错的话)这表明Active Directory的 unicodePwd 属性不仅接受UCS-2中不存在的UTF-16字符,它也是当密码包含4个字节的长度字符时,它应该表现得很好。

答案 1 :(得分:1)

正确的字符编码是UTF-16LE。此外,密码必须用双引号括起来。我不确定UCS-2编码在哪里提到过,从未亲眼见过。

实施例

用户密码: test
引用密码:&#34; test&#34;
UTF-16LE表示:

0x22 "
0x00
0x74 t
0x00
0x65 e
0x00
0x73 s
0x00
0x74 t
0x00
0x22 "
0x00

有关详细信息,请参阅MSDN