我正在重写代码,以便与PHP 7.2兼容。旧的代码是
public function encryptPasswordOld($password, $salt)
{
$key = md5($salt);
$result = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $password, MCRYPT_MODE_ECB);
return base64_encode($result);
}
根据我的研究,新的代码应该是这样的
public function encryptPasswordNew($password, $salt)
{
$method = 'AES-256-ECB';
$ivSize = openssl_cipher_iv_length($method);
$iv = openssl_random_pseudo_bytes($ivSize);
$key = md5($salt);
$result = openssl_encrypt($password, $method, $key, OPENSSL_RAW_DATA, $iv);
return base64_encode($result);
}
但我尝试了所有openssl_encrypt选项的组合:OPENSSL_RAW_DATA
、OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING
、OPENSSL_ZERO_PADDING
、0
,但在旧方法返回时仍然得到不同的结果
发布于 2020-11-02 16:51:39
请尝试在加密前对值使用pkcs5padding。即
记住,数据块大小应该是基于8字节的,例如8/16/24等等。
function pkcs5_pad($text, $blocksize)
{
$pad = $blocksize - (strlen($text) % $blocksize);
return $text . str_repeat(chr(0), $pad);
}
加密选项应为OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING,即
openssl_encrypt(pkcs5_pad($value, 16), 'aes-256-ecb', $aes_key, 3, '')
https://stackoverflow.com/questions/48742984
复制相似问题