1

我正在尝试编写一个 PHP 脚本,该脚本接受一个 csv 文件,然后创建一个 LDIFDE 文件以将学生导入 AD。

我有一切工作,但密码。

问题似乎出在 PHP 中的 base64_encode() 上。

echo $password = '"Password1"';
echo "<br />";
echo $testPass = base64_decode("IgBQAGEAcwBzAHcAbwByAGQAMQAiAA==");
echo "<br />";
echo base64_encode($password);
echo "<br />";
echo "IgBQAGEAcwBzAHcAbwByAGQAMQAiAA==";
echo "<br />";
echo base64_encode($testPass);

输出是:

"Password1"
"Password1"
IlBhc3N3b3JkMSI=
IgBQAGEAcwBzAHcAbwByAGQAMQAiAA==
IgBQAGEAcwBzAHcAbwByAGQAMQAiAA==

我找不到“Password1”之间的区别。有谁知道我在这里做错了什么?一旦我可以让我的初始和编码的 $password 与编码的 $testPass 匹配,我应该能够让它正常工作。

4

1 回答 1

3

我将把你的两个 base64 编码字符串称为“短字符串”和“长字符串”。

长字符串似乎是编码为 UTF16 Little Endian(或 UCS-2LE)的短字符串。查看长字符串解码的十六进制转储:

          00 01 02 03 04 05 06 07 - 08 09 0A 0B 0C 0D 0E 0F  0123456789ABCDEF

00000000  22 00 50 00 61 00 73 00 - 73 00 77 00 6F 00 72 00  ".P.a.s.s.w.o.r.
00000010  64 00 31 00 22 00                                  d.1.".

如您所见,每个有效的 ASCII 字节后面都有一个空字节,这就是您的差异的来源。问题是,你想要长字符串还是短字符串?无论哪种方式,请查看mb_convert_encoding()PHP 手册以了解您要去的地方。

长字符串的编码是“UCS-2LE”;短字符串的编码类似于“ISO-8859-1”或“cp1252”。根据您尝试生成的参数,将它们放入“from”和“to”参数中。

编辑 - 必需的调用

我在评论中发布了这个,但为了便于参考,我将它包括在这里。为了获得长字符串,mb_convert_encoding()使用“UCS-2LE”作为第二个参数进行调用。例子:

$password = '"Password1"';
echo base64_encode(mb_convert_encoding($password, 'UCS-2LE'));

产生:

IgBQAGEAcwBzAHcAbwByAGQAMQAiAA==
于 2013-05-21T19:38:16.960 回答