mcrypt解码数据类型

时间:2014-05-22 02:16:12

标签: php access-token mcrypt

我有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");

//运行scrypt后,我得到以下结果:    原始字符串:secrettoken    加密字符串:encrypted_string    解密的字符串:secrettoken    String = Decrypted string:False

所以看起来即使$ string和$ descrypted-string的值相同,试图比较这些值证明它们不是。我假设它与数据类型有关。我必须承认我只是在学习PHP(我的主要平台是Java,并且声明了与PHP不同的变量类型)。那么我怎样才能比较这两个值才能成真呢?我尝试使用&#34; ===&#34;并且也没有用。

1 个答案:

答案 0 :(得分:1)

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

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

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

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

宽松比较==不考虑变量类型,例如'123' == 123是真的。严格比较=== 会考虑类型,例如'123' === 123是假的。在我看来,如果你期望变量是某种类型,应该尽可能使用严​​格的比较,因为松散的比较布尔值真可以== 1,甚至是0.随着PHP shuffles,有时会出现一些意想不到的结果变量类型适合自己...