加密/哈希问题

时间:2011-10-09 05:24:07

标签: php hash sha1 mcrypt rijndael

我正在开发一个小脚本,允许我在cookie中存储相对安全的信息,以便在不使用会话的情况下验证用户登录。部分输出是在生成hmac_hash时使用的加密盐,其中包含存储在cookie中的一些信息,以及数据库中的一些用户信息。

但是,经过一些测试后,我遇到了字符串加密/解密问题并导致不同的哈希结果。

即:

$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是从另一个文件中提取的加密密钥。

我试图理解为什么显示的字符是相同的,但实际的变量是不同的(否则哈希结果会是相同的),并且有什么方法可以确保两个字符串对于哈希目的是相同的?

谢谢, 莱恩。

1 个答案:

答案 0 :(得分:2)

根据评论,看起来你得到尾随空值 - mcrypt的块大小可能是32字节,任何加密/解密的字符串都必须是这么多字节的倍数。

取自mcrypt_encrypt文档:

  

如果数据大小不是n * blocksize,则数据将用'\ 0'填充。