perl中的情况
$password = 'admin';
$newchal = 'hnfdfhj238478wdehf';
$password2 = unpack "H32", ($password ^ $newchal);
这是非常重要的,因为我将此密码发送到需要正确编码的radius服务器。上面的方法来自标准脚本。
现在在PHP中尝试过:
$password2 = unpack("H32", $password.''.$newchal);
我比较了输出,但它有所不同......我无法弄清楚'^'在perl中意味着什么。 任何人都可以帮助我吗?
答案 0 :(得分:2)
^
是C派生语言中的按位XOR(exclusive-or)运算符,包括Perl和PHP。
当两个操作数中的一个为真时,XOR操作为真。真值表是
0 ^ 0 == 0
0 ^ 1 == 1
1 ^ 0 == 1
1 ^ 1 == 0
当在字符串上使用按位XOR时,二进制表示的每个位都被异或。
E.g。 a
是ASCII 0x61
,h
是ASCII 0x68
。他们拼凑在一起,产生一个标签:
a (61): 01100001
h (68): 01101000
\t (09): 00001001
按位异或有时用于可逆“加密”,但这个技巧众所周知,而且非常不安全。例如。在您的示例中,密码长度大于密钥的密码未完全异或,因此部分明文保持可见。如果为多个密码共享相同的密钥,则破解非常便宜。这种“加密”也非常容易受到例如明文攻击。要存储密码,应使用更复杂的散列算法。有一些特殊的密码哈希算法,如 bcrypt 或 PBKDF2 。