McRypt解码数据类型


mcrypt decode data type

我有用于mcrypt编码和解码访问令牌的PHP代码,如下所示:

$string = "secrettoken";
// Encryption/decryption key
$key = "key12345";
// Encryption Algorithm
$cipher_alg = MCRYPT_RIJNDAEL_256;
// Create the initialization vector for added security.
$iv = mcrypt_create_iv(mcrypt_get_iv_size($cipher_alg, 
    MCRYPT_MODE_ECB), MCRYPT_RAND);
// Output original string
print "Original string: $string <p>";
// Encrypt $string
$encrypted_string = mcrypt_encrypt($cipher_alg, $key, $string, MCRYPT_MODE_CBC, $iv);
$token = bin2hex($encrypted_string); //prints in hexadecimal format
// Convert to hexadecimal and output to browser
print "Encrypted string: ".encrypted_string."<p>";
$decrypted_string = mcrypt_decrypt($cipher_alg, $key, $encrypted_string,  
    MCRYPT_MODE_CBC,$iv);
print "Decrypted string: $decrypted_string";
//check if the original string is equal to the descripted string
if($decrypted_string == $string)
    print("Yep");
else 
print("Nada");

//运行脚本后,得到如下结果:原始字符串:secrettoken加密字符串:encrypted_string解密后的字符串:secrettokenString=解密字符串:False

所以看起来即使$string和$descrypted-string的值是相同的,但是尝试比较它们的值证明它们不是。我认为这与数据类型有关。我必须承认,我只是在学习PHP(我的主要平台是Java,有变量类型的声明不像PHP)。那么我如何比较这两个值来得到真值呢?我尝试使用"===",也没有工作。

我在本地运行了这个,每个变量的var_dump显示您的解密变量在末尾有一些字符(��������������������)。

添加一个简单的trim()来删除空格和新行等到这个变量产生一个严格比较的相同匹配(===)。

if(trim($decrypted_string) === $string)
    print("Yep");

作为参考(因为你说你是PHP新手),var_dump($var_name)是比较变量的好方法,因为它输出变量类型以及值和任何空白等两端。

松散比较==没有考虑变量类型,因此例如'123' == 123为真。严格比较=== 会考虑类型,因此例如'123' === 123为false。在我看来,如果您期望变量是某种类型,应该尽可能使用严格的比较,因为使用松散比较布尔值可以==为1,甚至为0。有时候,PHP会根据自己的需要改变变量类型,从而导致一些意想不到的结果。