我正在编写一个小脚本,它将允许我在cookie中存储相对安全的信息,以验证用户登录而不使用会话。输出的一部分是在生成hmac_hash时使用的加密盐,其中一些信息存储在cookie中,一些用户信息存储在数据库中。
然而,经过一些测试后,我遇到了字符串加密/解密的问题,并导致不同的哈希结果。
ie:$str = '123456abcdef';
$hash1 = sha1($str);
$v1 = do_encrypt($str);
$v2 = do_decrypt($v1);
$hash2 = sha1($v2);
最后是
$hash1 - d4fbef92af33c1789d9130384a56737d181cc6df
$hash2 - 0d6034f417c2cfe1d60d263101dc0f8354a1216f
但是当我回显两个字符串时,它们都是123456abcdef。
do_encrypt函数如下:
function do_encrypt($value) {
$salt = generate_salt();
$td = mcrypt_module_open('rijndael-256', '', 'cbc', '');
mcrypt_generic_init($td, $ek, $salt);
$encrypted_data = mcrypt_generic($td, $value);
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
return base64_encode($salt.$encrypted_data);
}
do_decrypt函数:
function do_decrypt($value) {
$data = base64_decode($value);
$salt = substr($data, 0, 32);
$data = substr($data, 32, strlen($data));
$td = mcrypt_module_open('rijndael-256', '', 'cbc', '');
mcrypt_generic_init($td, $ek, $salt);
$decrypted_data = mdecrypt_generic($td, $data);
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
return $decrypted_data;
}
对于这两个函数$ek是从另一个文件中提取的加密密钥。
我试图理解为什么显示的字符是相同的,但实际的变量是不同的(否则哈希结果将是相同的),是否有任何方法来确保这两个字符串是相同的哈希目的?
谢谢,瑞安。
根据注释,看起来你得到的是尾随空-很可能mcrypt的块大小为32字节,任何加密/解密的字符串必须是这个字节的倍数。
摘自mcrypt_encrypt
文档:
如果数据的大小不是n *块大小,数据将用''0'填充。