我有一个函数来加密字符串:
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;
}问题是,即使添加相同的字符串,我也总是返回不同的值。
示例:
I简介: StackOverflow
结果: InT3g0AUXXTrmCAxrlht5ZVe8GBmlgGDMotXuVu11hI =
如果我重新运行脚本:
I简介: StackOverflow
结果: ImhWn5vPA / A2NY2wpUwg7VLWAiGBls80Z84fGU303Ws =
如果我重新运行脚本:
I简介: StackOverflow
结果: FqvxSsblSwz5riaDnnq7h20PzZTPdk /K+ dikLHbLHTY =
我怎样才能使它始终保持相同的价值呢?
发布于 2016-12-30 13:52:00
您正在使用$iv作为伪随机数生成器创建不同的MCRYPT_DEV_URANDOM,使用相同的$iv,结果将相同。
您可以将其存储在数据库中、类实例中,也可以将其存储为最终散列的前缀/后缀。
尽管您不应该为了安全目的重用$iv .
关于重用密钥(甚至IV )的安全含义的更有洞察力的主题可以在这里找到:https://crypto.stackexchange.com/questions/10505/reusing-keys-with-aes-cbc
发布于 2016-12-30 13:48:58
结果依赖于您不断重新生成的$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;
}但是,对于最佳实践,应该将其保存在配置文件中。
https://stackoverflow.com/questions/41397233
复制相似问题