我有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;并且也没有用。
答案 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,有时会出现一些意想不到的结果变量类型适合自己...