如何在加密字符串时始终获得相同的结果?

时间:2016-12-30 13:40:05

标签: php encryption

我有这个函数来加密字符串:

public function encriptar($string) {
    $iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC), 
                            MCRYPT_DEV_URANDOM);
    $encrypted = base64_encode($iv . mcrypt_encrypt(MCRYPT_RIJNDAEL_128,
                                                    hash('sha256', getKey(), true), 
                                                    $string, MCRYPT_MODE_CBC, $iv));    
    return $encrypted;
}

问题是我总是返回一个不同的值,即使添加相同的字符串。

示例:

我介绍: StackOverflow

结果:InT3g0AUXXTrmCAxrlht5ZVe8GBmlgGDMotXuVu11hI =

如果我重新运行脚本:

我介绍: StackOverflow

结果: ImhWn5vPA / A2NY2wpUwg7VLWAiGBls80Z84fGU303Ws =

如果我重新运行脚本:

我介绍: StackOverflow

结果: FqvxSsblSwz5riaDnnq7h20PzZTPdk / K + dikLHbLHTY =

如何使它始终具有相同的值?

2 个答案:

答案 0 :(得分:0)

结果取决于您继续重新生成的$ iv变量。您只需要生成一次,将其保存在数据库中,然后重新使用它。

function getIv($database) {
    // fictive database abstraction layer
    $iv = $database->fetchIv();
    if (!$iv) {
        $iv = mcrypt_create_iv(
            mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC), 
            MCRYPT_DEV_URANDOM
        );
        $database->saveIv($iv);
    }

    return $iv;
}

// in your class

public function encriptar($string) {
    $encrypted = base64_encode($iv . mcrypt_encrypt(MCRYPT_RIJNDAEL_128,
                                                    hash('sha256', getKey(), true), 
                                                    $string, MCRYPT_MODE_CBC, getIv()));    
    return $encrypted;
}

但是,对于最佳实践,应将其保存在配置文件中。

答案 1 :(得分:0)

您使用$iv作为伪随机数生成器创建了不同的MCRYPT_DEV_URANDOM,使用相同的$iv,结果将是相同的。

您可以将其存储在数据库中,类实例中,也可以将其存储为最终哈希的前缀/后缀。

虽然出于安全考虑,您不应该重复使用$iv ...

可以在此处找到关于重用密钥甚至IV的安全隐患的更具洞察力的主题:https://crypto.stackexchange.com/questions/10505/reusing-keys-with-aes-cbc